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 はv
being{1,2,3,1,2,3}
で終了しますが、コード 2 は無限ループに陥ります。説明は非常に簡単に思えます: のend()
イテレータはvector
メモリ位置を指し、for loop に基づく範囲で一度だけ評価されるため、ベクトルの 3 番目の要素を超えると停止します。一方、list
おそらく最後の要素の後に常に配置される終了イテレータとして何らかの null トークンを持っているため、ループがそこに到達することはありません。
結果は簡単に見えますが、私の質問は、これについて標準は何と言っているのですか? すべての標準ライブラリの実装でそうなるはずですか、それともこの動作は定義されていませんか? そのようなコンテナーを呼び出す可能性のあるループを作成するときは、何を期待すればよいpush_back()
でしょうか (通常は回避したいのですが)。