私はc ++で小さなquadedgeクラスを書こうとしています(ある種のグラフと考えてください)。すべてのノードは、近隣ノードを追跡する必要があります。出て行くアークだけを追跡する必要があります。
最初のアイデアは、ポインターを使用してそれを行うことです。
struct Node {
//....
Node * n1,n2,... nk;
};
ただし、このアプローチは、コピー コンストラクターを実装する必要がある場合に特に苦痛です* (最初にすべてのノードをコピーし、次に古いノードへのすべてのポインターを新しいノードへの相対ポインターにマップします)。
この場合、ポインターの代わりに整数インデックスを使用する方が良いと思います。
struct Node {
//....
int n1,n2,...nk;
};
このアプローチは一般的で正しいですか?もしそうなら、インデックスをノードにマッピングするのに適切なコンテナはどれですか?
std::vector<Node>
おそらく最も効率的な方法です。ベクター内のインデックスを使用してノードを参照できますが、残念ながら、グラフからノードを削除するのは非常に複雑です (グラフ内のすべての参照をリベースする必要があります)。
を使用std::unordered_map<int,Node>
する方が少し良いでしょうが、まだ自由な名前を追跡する必要があります (ノード 1、2、3 を挿入してから 2 を削除すると、名前 2 が使用可能であるという事実を追跡する必要があります)。
私が必要とするのは、ヒープの実装と非常に似ています。ベースからのオフセットをポインター型として使用するプール アロケーターを考えてみてください。
このような一般的なコンテナはありますか (Boost またはその他の一般的なライブラリ内)?
※その有用性はコピーコンストラクタに限らず、シリアライズなども考えてみてください