【发布时间】:2011-09-20 09:20:07
【问题描述】:
关于this question on iterator invalidation rules,标准的精神似乎很明显,例如,“双端队列中间的擦除使所有迭代器和对双端队列元素的引用无效”也指结束迭代器.
但是,我找不到标准明确说明这一点的任何地方,严格来说,结束迭代器不是容器中 元素 的迭代器。
2003 年标准是否在某处明确说明了这一点?
【问题讨论】:
-
例如,23.1/10: no
swap()函数使任何引用被交换容器元素的引用、指针或迭代器无效。 [ 注意: end() 迭代器不引用任何元素,因此它可能会失效。 —尾注] ...我不知道我们是否可以确定iterator referring to an element在标准中一直被用于排除结束迭代器:/ -
找不到任何与其他迭代器不同的段落。
end() returns an iterator which is the past-the-end value for the container。就这样。哎呀。 -
我手头没有 2003 标准,但 C++0x 似乎对此很清楚,例如“擦除双端队列最后一个元素的擦除操作只会使 过去的迭代器 和所有迭代器以及对被擦除元素的引用无效。” (强调我的)。
-
@MarkRansom:当然。不过,这不是这个问题的目的。
-
@Johannes:我想如果
end迭代器指向容器内的哨兵值,那么交换后的end迭代器不会指向“正确”容器中的哨兵,因此任何序列 [it, end) 都将是格式错误的,因为end无法从it访问。