注意:这个问题也适用于erase
。见底部。
在调用 aend() - 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())
”;那只是在乞求问题。)