【问题标题】:End iterator invalidation rules结束迭代器失效规则
【发布时间】: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 访问。

标签: c++ iterator


【解决方案1】:

例如,23.1/10:

没有swap() 函数使任何引用被交换的容器元素的引用、指针或迭代器无效。 [ 注意:end() 迭代器不引用任何元素,因此它可能会失效。 ——尾注]

我不知道我们是否可以确定引用元素的迭代器在标准中一直被用于排除结束迭代器:/

正如评论中所说,我想这是为了允许结束迭代器指向容器内的标记值。

例如,典型的双向链接List 实现是创建一个Node 结构,并在List 中按值有一个Node 作为结束节点。

【讨论】:

  • 我很满意,通过这个答案和相关的 cmets,C++03 在这件事上是模棱两可的。当然,在实践中,我们知道我们应该像对待容器元素的迭代器一样对待过去的迭代器;但是,这个答案是 this 问题的答案。
猜你喜欢
  • 1970-01-01
  • 2017-10-05
  • 2016-10-26
  • 2023-01-13
  • 2012-08-16
  • 1970-01-01
相关资源
最近更新 更多