C ++
C ++ Iterator失效规则中最受欢迎的帖子声称,不清楚过去最终迭代器(即由end()
, cend()
, rend()
和crend()
)返回的迭代器是否根据与常规迭代器相同的规则,它指向容器中的元素。 针对2003年和2011年C ++制定的这些声明都遵循讨论End迭代器失效规则的帖子,其中接受的答案表明2003年的标准在这个问题上含糊不清。 这个结论是基于23.1 / 10中的一个评论(在swap()
),这似乎意味着当规范没有明确提到过时端迭代器的失效时,它们可能会失效。
对这个帖子的问题(mike-seymour)的评论表明C ++ 11在这个问题上是明确的,就deque
。 我的问题是关于所有容器:
换言之,
我的问题是关于所有容器:
我不确定你的意思是“在语言规范中这种行为是不明确的”,但肯定会有操作使顶过的操作符无效(如插入到std::vector
或std::string
)。
换言之,
您可以像任何其他迭代器一样信任过去端迭代器:任何不会(可能)使迭代器失效的操作不会使它们失效。 除了这个标准存在bug的可能性之外,所有的操作都不会说它们(可能)会使操作员失效。
如果标准说操作不会使迭代器失效,你应该可以信任它。 其他任何应该被视为标准库实现中的错误。
至少在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
}
链接地址: http://www.djcxy.com/p/73325.html
上一篇: c++
下一篇: Problem with invalidation of STL iterators when calling erase