首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++11中的过端迭代器失效

C++11中的过端迭代器失效
EN

Stack Overflow用户
提问于 2012-07-06 02:35:38
回答 3查看 2.8K关注 0票数 26

C++ Iterator invalidation rules上最受欢迎的帖子声称,不清楚过去-结束迭代器(即,由end()cend()rend()crend()返回的迭代器)是否根据与指向容器中元素的常规迭代器相同的规则无效。这些声明都是针对2003年和2011年的C++做出的,遵循了一篇讨论End iterator invalidation rules的文章,其中被接受的答案表明2003年的标准在这个问题上是模棱两可的。这个结论基于23.1/10 (在swap()的上下文中)中的一条评论,该评论似乎暗示,当规范没有明确提到过期迭代器的无效时,它们可能会失效。

对该帖子的问题(由mike-seymour提出)的评论表明,在deques的情况下,C++11在这个问题上是明确的。我的问题是关于所有容器:

  • 在C++11中,是否有任何容器操作可能会使经过-结束的迭代器无效,并且这种行为在语言规范中是不明确的?

换句话说,

在执行容器操作后,我是否可以信任过期迭代器的有效性?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-09 04:50:22

我的问题是关于所有容器的:

  • 在C++11中,是否有任何容器操作可能会使经过-结束的迭代器无效,并且这种行为在语言规范中是不明确的?

我不确定您所说的“这种行为在语言规范中有歧义的地方”是什么意思,但是肯定有一些操作会使过去的结束操作符无效(比如插入到std::vectorstd::string中)。

说的不一样,

在执行容器操作后,我是否可以信任过期迭代器的有效性?

您可以像信任任何其他迭代器一样信任过去式迭代器:任何不会(潜在地)使迭代器无效的操作都不会使其无效。除了标准存在bug的可能性之外,所有的操作都没有说明它们(可能)使运算符无效。

票数 12
EN

Stack Overflow用户

发布于 2012-07-06 02:52:05

如果标准说操作不会使迭代器无效,那么你应该能够信任它。其他任何东西都应该被视为标准库实现中的错误。

票数 2
EN

Stack Overflow用户

发布于 2013-11-15 17:09:50

至少在GCC结束时,迭代器对于std::map:

#include <set>
#include <stdlib.h>
#include <assert.h>
int main() {
  std::set<int> a;
  a.insert(1);
  std::set<int>::reverse_iterator rit(a.rbegin());
  ++rit;
  assert(rit==a.rend());
  a.erase(a.begin());
  assert(a.rend()==rit); // FAIL
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11350454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档