C++ 11中的过去迭代器失效

nkn*_*ght 22 c++ iterator

上C++最流行的交迭代器失效规则声称,目前还不清楚,如果在过去的最端迭代器(即,那些由返回end(),cend(),rend(),和crend())根据相同的规则正常迭代器,这点在元件被无效容器.这些针对2003和2011 C++的声明,推迟到讨论End迭代器失效规则的帖子,其中接受的答案表明2003标准在这个问题上是模棱两可的.这一结论是基于23.1/10评论(在的情况下swap(),这似乎暗示,当规范没有明确提及过去的最末端迭代器失效,他们可能会失效).

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

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

换句话说,

  • 在执行容器操作之后,我是否可以信任过去的迭代器的有效性,而不会说它可能使过去的迭代器无效?

sbi*_*sbi 11

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

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

我不确定你对"语言规范中这种行为不明确的地方"的意思,但肯定会有一些操作使得过去的操作符无效(比如插入一个std::vector或者std::string).

换句话说,

  • 在执行容器操作之后,我是否可以信任过去的迭代器的有效性,而不会说它可能使过去的迭代器无效?

您可以像任何其他迭代器一样信任过去的迭代器:任何不(可能)使迭代器无效的操作都不会使它们失效.除了标准运行错误的可能性之外,所有操作都没有说它们(可能)使运营商无效.