0

コードのスニペットがあり、最初にいくつかの値をに入れてから、std::vector次のように、それらを使用するオブジェクトの1つにそれぞれのアドレスを指定します。

std::vector < useSomeObject > uso;

// uso is filled

std::vector < someObject > obj;

for (int i=0; i < numberOfDesiredObjects; ++i){
    obj.push_back(someObject());
    obj.back().fillWithData();
}
for (int i=0; i < numberOfDesiredObjects; ++i){
    uso[i].setSomeObject(&obj[i]);
}

// use objects via uso vector
// deallocate everything

さて、私は時々スタイルフリークなので、これは醜いと思います。次のように、forループを1つだけ使用したいと思います。

for (int i=0; i < numberOfDesiredObjects; ++i){
    obj.push_back(someObject());
    obj.back().fillWithData();
    uso[i].setSomeObject(&obj.back());
}

もちろん、再割り当てが時々発生し、設定したすべてのポインタが無効になったため、それはできません。

だから、私の質問はstd::vector.reserve()、あなたがどれだけ必要になるかを知っていて、事前にメモリを割り当てたいのであれば、それが進むべき道であることを知っています 。で事前に十分なメモリを割り当てようとしていることを確認した場合reserve()それは私のポインタが有効なままであることを保証しますか?

ありがとうございました。


サイドノート。 これも同様の質問ですが、知りたいことに対する答えはありません。この質問への最初のコメントとしてポップアップしないようにするためです。

4

2 に答える 2

5

これは、実際、を使用する主な理由の1つですreservestd::vectorベクトルの新しいサイズが古い容量を超えない限り、の末尾に追加しても、ベクトル内の要素へのイテレータ、参照、またはポインタが無効にならないことが保証されます。

于 2012-05-24T09:58:32.190 に答える
4

reserved()を使用して事前に十分なメモリを割り当てようとしていることを確認した場合、ポインタが有効なままであることが保証されますか?

はい、それはあなたのポインタが以下の場合を除いて有効であり続けることを保証します:

  • サイズが現在の容量を超えて増加するか、
  • そうでない限り、あなたが消去しない要素を消去します。

ベクトルのイテレータ無効化ルールは、23.2.4.3/1および23.2.4.3/3で次のように指定されます

新しいコンテナのサイズが以前の容量よりも大きい場合を除いて、挿入ポイントの前のすべてのイテレータと参照は影響を受けません(この場合、すべてのイテレータと参照は無効になります)

消去ポイント以降のすべてのイテレータと参照は無効になります。

于 2012-05-24T09:58:26.567 に答える