在向量中无效的迭代器

Invalidated iterator in a vector

本文关键字:迭代器 无效 向量      更新时间:2023-10-16

我知道擦除在擦除点和之后的迭代器无效。考虑:

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()是否保证保持真实?

edit :从顶部答案中,如果只有 it单数值,则看起来是UB。但是,在STL迭代器的背景下,什么是奇异和非单明价值?似乎it IS(或(与容器关联,因此使it 非singular

我感谢对此的进一步分析,谢谢。

一旦您的迭代器无效,将其与其他事物进行比较可能是UB:

[C++14: 24.2.1/10]: an 无效迭代器是一个可能是单数的迭代器。

[C++14: 24.2.1/5]: [..] 大多数表达式的结果对于单数值不确定;唯一的例外是破坏具有单一值的迭代器,将非单明价值分配给具有单数值的迭代器,对于满足DefaultConstructible要求的迭代器,使用值initialialized Iterator作为来源副本或移动操作。 [..]

请注意,这意味着您也无法将默认构造的迭代器与任何.end()进行比较。

与普遍的看法相反,"指数只是记忆地址",这些规则对于指示器而言也很大。实际上,迭代器的规则是对指针规则的概括。

正式地指向删除元素上或之后的元素无效的任何迭代器。所以

  1. 是的,这是UB(尽管它是引擎盖下的指针。(

  2. ub,尽管有明显的合理性。