在向量中无效的迭代器
Invalidated iterator in a vector
我知道擦除在擦除点和之后的迭代器无效。考虑:
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()
进行比较。
与普遍的看法相反,"指数只是记忆地址",这些规则对于指示器而言也很大。实际上,迭代器的规则是对指针规则的概括。
正式地指向删除元素上或之后的元素无效的任何迭代器。所以
-
是的,这是UB(尽管它是引擎盖下的指针。(
-
ub,尽管有明显的合理性。
相关文章:
- 修改 std::vector 会使迭代器无效吗?
- 如何避免使用“ReplaceInstWithValue()”使迭代器无效
- 当此容器也是容器的元素时,为什么容器的迭代器无效
- std :: move()会使迭代器无效
- 具有deque的随机访问迭代器的迭代器无效
- 有人能解释一下他们的意思是list.pushback文档(不会使迭代器无效)吗
- 为什么Boost图库在删除顶点时会使所有迭代器无效
- 为什么插入会使标准::设置反向迭代器无效
- 调试断言失败:迭代器无效
- 如果另一个线程将一个元素推到向量的末尾,则向量上的迭代器无效
- std::priority_queue,带有std::map元素的迭代器-无效堆
- 是否有一个标准容器允许在不使迭代器无效的情况下插入元素
- std::insert_iterator和迭代器无效
- std::vector::erase()是否在擦除时使迭代器无效
- STL矢量擦除后的迭代器无效
- 读取大小为4的迭代器无效
- 什么是迭代器无效?
- Std::list.unique()应该使迭代器无效
- 结束迭代器无效规则
- std::vector::swap()和有状态分配器是否应使所有迭代器无效