我知道擦除操作会使得迭代器在擦除点及其之后的位置失效。请考虑以下代码:
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int>::iterator it = vec.end() - 1; //last element
vec.erase(vec.begin()); //shift everything one to the left, 'it' should be the new 'end()' ?
std::cout << (it == vec.end()); //not dereferencing 'it', just comparing, UB ?
比较(而非引用)一个被使无效的迭代器(在这种情况下为
it
)是否是未定义行为?如果不是,it == vec.end()
保证成立吗?编辑:从顶部的答案看来,如果只有
it
是奇异值,那么这是未定义行为。但是从STL迭代器上下文中的奇异和非奇异值是什么?可以看出,it
(或曾经)与容器相关联,因此使it
非奇异。我会感激更深入的分析,谢谢。
it
可能是非单数的。请参见 https://dev59.com/uW035IYBdhLWcg3wZvJg 。虽然it
是无效的,但它与容器“关联”(更准确地说,曾经关联),这使得它是非单数的。 - PoweredByRice