C++ Iterator invalidation rules上最受欢迎的帖子声称,不清楚过去-结束迭代器(即,由end()
、cend()
、rend()
和crend()
返回的迭代器)是否根据与指向容器中元素的常规迭代器相同的规则无效。这些声明都是针对2003年和2011年的C++做出的,遵循了一篇讨论End iterator invalidation rules的文章,其中被接受的答案表明2003年的标准在这个问题上是模棱两可的。这个结论基于23.1/10 (在swap()
的上下文中)中的一条评论,该评论似乎暗示,当规范没有明确提到过期迭代器的无效时,它们可能会失效。
对该帖子的问题(由mike-seymour提出)的评论表明,在deque
s的情况下,C++11在这个问题上是明确的。我的问题是关于所有容器:
换句话说,
在执行容器操作后,我是否可以信任过期迭代器的有效性?
发布于 2013-05-09 04:50:22
我的问题是关于所有容器的:
我不确定您所说的“这种行为在语言规范中有歧义的地方”是什么意思,但是肯定有一些操作会使过去的结束操作符无效(比如插入到std::vector
或std::string
中)。
说的不一样,
在执行容器操作后,我是否可以信任过期迭代器的有效性?
您可以像信任任何其他迭代器一样信任过去式迭代器:任何不会(潜在地)使迭代器无效的操作都不会使其无效。除了标准存在bug的可能性之外,所有的操作都没有说明它们(可能)使运算符无效。
发布于 2012-07-06 02:52:05
如果标准说操作不会使迭代器无效,那么你应该能够信任它。其他任何东西都应该被视为标准库实现中的错误。
发布于 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
}
https://stackoverflow.com/questions/11350454
复制相似问题