std::vector<Node*> nodes;
私が aと aを持っているとしましょうstd::vector<Unit*> units;
。各ノードはユニットを指し、各ユニットはノードを指すため、それらは接続されています。しかし、eraseを使用していずれかの配列の中間から要素を削除するとどうなるでしょうか? 配列のサイズを変更する場合、それはすべての要素を削除し、それらをバッファに格納して、サイズ変更された配列を元に戻すことを意味しますか? ノードで消去を使用すると、ユニット内のポインターが無効になりますか?
3 に答える
ベクターの途中で要素を削除または挿入すると、上位のすべての要素が適切に下または上に移動します。しかし、ポインターを移動しているだけなので、それはほとんど簡単な操作です。他のポインター (消去していないポインター) には何も起こらず、どのpointeesにも何も起こりません。
ポインターのベクトルから要素を消去しても、ポインターが指すオブジェクトの削除は呼び出されません。Node<->Unit ポインタは有効なままです。
ベクトルで erase を使用すると、消去された要素の後のすべての要素のポインタが無効になります。
ベクターの途中で消去/挿入を使用すると、他の要素がメモリ内でシフトダウンまたはシフトアップされます。これらのポインターを使用すると、未定義の動作が発生します。
これらのポインターを有効に保ちたい場合は、次のオプションがあります。
消去後、消去に使用したベクターをループし、要素ポインターを他のベクターに再割り当てします。
リストを使用します。list.erase() は、消去する要素を除いてポインター/イテレーターを無効にしないため、他のベクターで消去したアイテムのポインターを必ず削除してください。
リストの欠点は、ランダム アクセスがないことです。そのため、list[] を使用せずに繰り返し処理する必要があります。
お役に立てれば。