1

私がこのコードを持っているとしましょう:

std::vector<Object*> objects;
std::vector<Object*>::iterator iter;
for (iter = objects.begin(); iter != objects.end(); iter++) {
    if (condition)
        objects.push_back(new Object());
}

ただし、push_backが発生すると、iter推論できなくなります。リセットせずiterに、参照不可にするにはどうすればよいですか?リセットする必要がある場合、iterが以前の場所に戻るようにリセットする簡単な方法はありますか?

4

6 に答える 6

5

インデックスでアクセスすることをお勧めします。これにより、問題が完全に解消されます。

于 2010-12-07T19:52:24.567 に答える
1

これに絶対にイテレータを使用する必要がある場合:

std::vector<Object*> objects;
std::vector<Object*> newObjects;
std::vector<Object*>::iterator iter;
for (iter = objects.begin(); iter != objects.end(); ++iter)
{
    if (condition)
    {
        newObjects.push_back(new Object());
    }
}

std::copy(newObjects.begin(), newObjects.end(), back_inserter<vector<Object*> >(objects));
于 2010-12-07T20:20:46.243 に答える
0

数値インデックスを使用した昔ながらのforループを作成する必要があります。それか、ループが実行される前にベクトルをreserve()して、サイズが変更されないようにします。

また、生のポインタ?Srsly。

于 2010-12-07T19:52:35.153 に答える
0

他のほとんどの回答がすでに述べているように、この場合はインデックスでベクトルにアクセスする方がよいでしょう。

ただし、完全を期すために:std::listイテレータにはこの「問題」はありません。listそのため、代わりに使用vectorすることが可能な解決策です。

于 2010-12-07T21:19:40.160 に答える
0

§23.1/11:

別の方法で指定されていない限り (明示的に、または他の関数に関して関数を定義することによって)、コンテナー メンバー関数を呼び出したり、コンテナーをライブラリー関数への引数として渡したりしても、そのコンテナー内のオブジェクトの反復子を無効にしたり、その値を変更したりしてはなりません。 .

ただし、 std::vector::push_back がイテレータを無効にすることは明示的に指定されていません。

于 2010-12-07T20:31:42.053 に答える
0

ベクトルがより多くのメモリを再割り当てする必要がある場合にのみ、反復子は無効になります。

メモリの再割り当てを防ぐには、reserve() を使用して必要なすべてのメモリを事前に割り当てます (ベクトルを割り当てるときにこのサイズがわかっていると仮定します)。

より簡単な解決策は、メンバーへの間接参照 (配列内のインデックス) を保持することです。

于 2010-12-07T20:02:25.597 に答える