注: この質問は にも当てはまりerase
ます。下を参照してください。
で呼び出されたend() - 1
後にイテレータが無効化されるという事実の背後にある理由は何ですか?pop_back
vector
明確にするために、私はこの状況について言及しています:
std::vector<int> v;
v.push_back(1);
v.push_back(2);
std::vector<int>::iterator i1 = v.begin(), i2 = v.end() - 1, i3 = v.begin() + 1;
v.pop_back();
// i1 is still valid
// i2 is now invalid
// i3 is now invalid too
std::vector<int>::iterator i4 = v.end();
assert(i2 == i4); // undefined behavior (but why should it be?!)
assert(i3 == i4); // undefined behavior (but why should it be?!)
なぜこれが起こるのですか?(つまり、この無効化が実装にとって有益であることが判明するのはいつですか?)
(これは単なる理論上の問題ではないことに注意してください。Visual C++ 2013 (おそらく 2012 でも) に_ITERATOR_DEBUG_LEVEL
設定している場合、デバッグ モードでこれを実行しようとするとエラーが表示され2
ます。)
についてerase
:
同じ質問が に
も当てはまることに注意してくださいerase
:erase(end() - 1, end())
end() - 1
(ですから、 「を呼び出すのと同じだから無効になる」pop_back
end() - 1
erase(end() - 1, end())
とは言わないでください。それはただの質問です。)