はい、イテレータが無効にvector
されていない限り、要素への「参照」を保持できます。vector
それは大きな警告です。
のvector
イテレータは、vector
が再割り当てされると無効になります。これは、に要素を追加するたびに発生する可能性がありますvector
。さらに、erase
からアイテムをvector
取得すると、削除ポイント以降のすべてのイテレータが無効になります。
これはすべて非常に複雑で、心配する必要はありません。イテレータが無効にならないようにする必要がある場合(そのアイテム自体を削除しない限り)、avector
は使用に最適なコレクションではない可能性があります。代わりに、、、、またはその他のコレクションをlist
検討することもできます。map
それぞれに独自のトレードオフのセットがあることに注意してください。
ただし、イテレータについてはまったく気にする必要がない場合があります。vector
アイテム自体ではなく、アイテムへのポインターを格納した場合、ベクトルが再割り当てされても、ポインターが指すものは移動しません。もちろん、このルートを進むには、可能であればスマートポインタを使用する必要があります。一見すると、最高のものはであるように見えますshared_ptr
。したがって、あなたのデルカレーションは次のようになります。
std::vector<shared_ptr<LargeClass>>
最後に、本当にaを使用する必要がありvector
、スマートポインターをいじりたくない場合は、内のアイテムへの「参照」vector
ではなく、それらのインデックス位置を追跡することをお勧めします。でアイテムを追跡したいとしますvecLargeClass[3]
。イテレータを無効にするために何かを行ったとしても、問題のアイテムは引き続きインデックスにあります3
。interator
sや物事へのポインタを追跡する代わりに、それらがのどこにあるかを追跡しvector
ます。