9

C++ 標準によるとpush_back()、ベクターの新しいサイズがその容量を超えた場合、ベクターを呼び出すと反復子が無効になりますが、リストでは反復子が無効になることはありません。次に、次のコード スニペットを検討してください。

1.

vector<int> v{1,2,3};
v.reserve(100);
for (int i: v) {
    v.push_back(i);
}

2.

list<int> l{1,2,3};
for (int i: l) {
    l.push_back(i);
}

gcc 4.8 で試してみたところ、コード 1 はvbeing{1,2,3,1,2,3}で終了しますが、コード 2 は無限ループに陥ります。説明は非常に簡単に思えます: のend()イテレータはvectorメモリ位置を指し、for loop に基づく範囲で一度だけ評価されるため、ベクトルの 3 番目の要素を超えると停止します。一方、listおそらく最後の要素の後に常に配置される終了イテレータとして何らかの null トークンを持っているため、ループがそこに到達することはありません。

結果は簡単に見えますが、私の質問は、これについて標準は何と言っているのですか? すべての標準ライブラリの実装でそうなるはずですか、それともこの動作は定義されていませんか? そのようなコンテナーを呼び出す可能性のあるループを作成するときは、何を期待すればよいpush_back()でしょうか (通常は回避したいのですが)。

4

1 に答える 1