私はstd::vector
たくさんの要素を含んでいます。ベクターは巨大なので、特定の要素へのポインターを別のベクターに格納して、より高速にアクセスできるようにします。しかし、ベクトルが大きくなるにつれて、その内部コンテナーが再割り当てされ、すべてのポインターが無効になることがあります。
これがいつ起こるかを知る方法はありますか?このようにして、他のリストのポインターを更新できます。
ポインタを格納するべきではなく、インデックスを格納する必要があります:
つまり、代わりに:
var1 = &vector[0];
var2 = &vector[13];
とアクセス*var1
、*var2
保存する必要があります:
i1 = 0;
i2 = 13;
とアクセスvector[i1]
、vector[i2]
注 : モディファイア メソッドを使用する場合は注意が必要です。
pop_back()
(これにより、最後の位置が無効になります)erase(i)
(これは、i より大きいすべてのインデックスをシフトします)(最初の方法には同じ注意事項がありました)
おそらく、boost::container::stable_vector: http://www.boost.org/doc/libs/1_51_0/doc/html/boost/container/stable_vector.htmlをご覧ください。
要素を大きなベクトルに直接格納する代わりに、個々の要素へのポインタを格納できます。したがって、の代わりにstd::vector<int>
を使用しstd::vector<int *>
ます。ベクターがコンテンツを再割り当てしても、データ自体のアドレスは変更されないため、ベクターへの他のポインターは有効なままです。ただし、これには、ベクターに入力する各要素を作成してから、削除するデータをnew
手動で作成する必要があります。delete
申し訳ありませんが、私のコメントは明らかに間違っていました。N3337 23.3.6.3 vector capacity paragraph 5
:
備考: 再割り当ては、シーケンス内の要素を参照するすべての参照、ポインター、および反復子を無効にします。
reserve()
への呼び出しの後に発生する挿入中は、挿入によってベクトルのサイズが の値よりも大きくなるまで、再割り当てが行われないことが保証されていますcapacity()
。