グラフ上で循環依存関係を避ける必要がありますか?例えば円の依存関係とグラフ
、それらの各々は、vertex
にその時点edge
オブジェクトの配列を有する、vertex
オブジェクトの配列を埋め込むクラスconsideer。
ここで、vertex
とedge
は循環に依存します。これは悪い考えですか?それはどうすれば避けられますか?
グラフ上で循環依存関係を避ける必要がありますか?例えば円の依存関係とグラフ
、それらの各々は、vertex
にその時点edge
オブジェクトの配列を有する、vertex
オブジェクトの配列を埋め込むクラスconsideer。
ここで、vertex
とedge
は循環に依存します。これは悪い考えですか?それはどうすれば避けられますか?
いいえ、そうしてはいけません。重要ではないエッジおよび頂点クラスを有するグラフは、本質的には循環依存のである。 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の代わりに<>ポインタを使用するか、edge
とvertex
が基本クラスでない限り、メンバーを持たないのがなぜでしょうか。 Stroustrupはさらに、終了時にowner<>
を使用して削除する必要がある裸のポインタをマーキングすることを推奨しています。あなたがそれを持っていないなら、あなたのためにno-opをtemplate<typename T> using owner = T;
と定義するかもしれません。
多くの場合、「エッジ」は、各「頂点」に対して識別子を使用し、各「頂点」へのポインタを使用しません。 'graph'には、頂点だけでなくエッジも含まれます。 – vu1p3n0x
@ vu1p3n0x:循環依存を避ける以外は、ポインタではなく識別子を使用するとどのように有益でしょうか? – servabat
これは、グラフの使用方法のコンテキストによって異なります。スタンドアロンで、グラフ自体に結びついていない 'edge'オブジェクトが必要な場合は、頂点へのポインタを使う必要があります。しかし、グラフクラスが頂点を 'vector'に格納し、頂点の追加をサポートしていれば、移動できるのでポインタを使用することはできません。 – vu1p3n0x