3

私はstd::vectorたくさんの要素を含んでいます。ベクターは巨大なので、特定の要素へのポインターを別のベクターに格納して、より高速にアクセスできるようにします。しかし、ベクトルが大きくなるにつれて、その内部コンテナーが再割り当てされ、すべてのポインターが無効になることがあります。

これがいつ起こるかを知る方法はありますか?このようにして、他のリストのポインターを更新できます。

4

4 に答える 4

6

ポインタを格納するべきではなく、インデックスを格納する必要があります:

つまり、代わりに:

var1 = &vector[0];
var2 = &vector[13];

とアクセス*var1*var2

保存する必要があります:

i1 = 0;
i2 = 13;

とアクセスvector[i1]vector[i2]


注 : モディファイア メソッドを使用する場合は注意が必要です。

  • pop_back()(これにより、最後の位置が無効になります)
  • erase(i)(これは、i より大きいすべてのインデックスをシフトします)
  • など...

(最初の方法には同じ注意事項がありました)

于 2012-10-01T14:12:19.527 に答える
4

おそらく、boost::container::stable_vector: http://www.boost.org/doc/libs/1_51_0/doc/html/boost/container/stable_vector.htmlをご覧ください。

于 2012-10-01T14:08:59.610 に答える
1

要素を大きなベクトルに直接格納する代わりに、個々の要素へのポインタを格納できます。したがって、の代わりにstd::vector<int>を使用しstd::vector<int *>ます。ベクターがコンテンツを再割り当てしても、データ自体のアドレスは変更されないため、ベクターへの他のポインターは有効なままです。ただし、これには、ベクターに入力する各要素を作成してから、削除するデータをnew手動で作成する必要があります。delete

于 2012-10-01T14:07:09.490 に答える
0

申し訳ありませんが、私のコメントは明らかに間違っていました。N3337 23.3.6.3 vector capacity paragraph 5:

備考: 再割り当ては、シーケンス内の要素を参照するすべての参照、ポインター、および反復子を無効にします。reserve()への呼び出しの後に発生する挿入中は、挿入によってベクトルのサイズが の値よりも大きくなるまで、再割り当てが行われないことが保証されていますcapacity()

于 2012-10-01T14:09:22.583 に答える