2016-06-13 18 views
2

グラフ上で循環依存関係を避ける必要がありますか?例えば円の依存関係とグラフ

、それらの各々は、vertexにその時点edgeオブジェクトの配列を有する、vertexオブジェクトの配列を埋め込むクラスconsideer。

ここで、vertexedgeは循環に依存します。これは悪い考えですか?それはどうすれば避けられますか?

+0

多くの場合、「エッジ」は、各「頂点」に対して識別子を使用し、各「頂点」へのポインタを使用しません。 'graph'には、頂点だけでなくエッジも含まれます。 – vu1p3n0x

+0

@ vu1p3n0x:循環依存を避ける以外は、ポインタではなく識別子を使用するとどのように有益でしょうか? – servabat

+0

これは、グラフの使用方法のコンテキストによって異なります。スタンドアロンで、グラフ自体に結びついていない 'edge'オブジェクトが必要な場合は、頂点へのポインタを使う必要があります。しかし、グラフクラスが頂点を 'vector'に格納し、頂点の追加をサポートしていれば、移動できるのでポインタを使用することはできません。 – vu1p3n0x

答えて

2

いいえ、そうしてはいけません。重要ではないエッジおよび頂点クラスを有するグラフは、本質的には循環依存のである。 edgeが実質的に空の場合、隣接行列(つまり、与えられた頂点の間に辺があるかどうか)を保存するだけです。 vertexが空の場合、ポインタの代わりに頂点番号(size_t)を格納するエッジリストを格納することがあります。 ベストプラクティスは、smart_ptr <>とweak_ptr <>を使用してチェーンを切断することです。後者は、このように、非所有である:

  • あなたのグラフを格納する頂点場合:
    • クラスはvector< smart_ptr<vertex> >
    • vertexクラスはvector< smart_ptr<edge> > m_out;および任意vector< weak_ptr<edge> > m_in;
    • edgeクラスはweak_ptr<vertex> m_vertices[2];(またはそれ以上を有していましたまだm_fromとm_to)
  • あなたグラフ店はエッジ場合:
    • クラスはvector< smart_ptr<edge> >
    • edgeクラスはsmart_ptr<vertex> m_from;weak_ptr<vertex> m_to;
    • vertexクラスが(何らかの理由で、vector< weak_ptr<edge> > m_out;および必要に応じてvector< weak_ptr<edge> > m_in;

の場合がありましたしましたシニアのwidsomのような:)、コーディング標準、など)あなたは使用することはできませんmart_ptr <>およびweak_ptr <>を使用すると、弱ポインタ​​の代わりに参照を使用することができます。これらのポインタは、通常、非所有とみなされます。 smart_ptrの代わりに<>ポインタを使用するか、edgevertexが基本クラスでない限り、メンバーを持たないのがなぜでしょうか。 Stroustrupはさらに、終了時にowner<>を使用して削除する必要がある裸のポインタをマーキングすることを推奨しています。あなたがそれを持っていないなら、あなたのためにno-opをtemplate<typename T> using owner = T;と定義するかもしれません。

関連する問題