请参阅有关尾后迭代器失效的相关问题:this https://stackoverflow.com/questions/11350454/past-the-end-iterator-invalidation-in-c11, this https://stackoverflow.com/questions/6440392/end-iterator-invalidation-rules.
这更多的是一个设计问题,即是否有(在STL或其他地方)这样的概念尾后迭代器“重新验证”?
我的意思和用例是:假设一个算法需要“尾随”一个容器(例如队列)。它遍历容器直到end()
到达,然后暂停;与此无关,程序的另一部分将更多项目放入队列中。该算法怎么可能(编辑)有效率的告诉,“有更多的项目已入队”,同时持有先前的末尾迭代器(称之为tailIt
)? (这意味着它能够检查是否tailIt == container.end()
still,如果这是错误的,则得出结论tailIt
现在有效并指向插入的第一个元素)。
请不要因为“不,没有”而忽略这个问题 - 我正在寻找围绕如何以惯用的方式设计某些逻辑的判断,并且有很多选择(事实上,有问题的迭代器是一个手) -我为其构建的数据结构can提供此属性 -end() 重新验证- 但我想判断这是否是一个好主意)。
编辑:明确我们有迭代器tailIt
and参考container
。我想做的一个简单的解决方法是,还请记住count
:= 你处理了多少个项目,然后检查是container.size() == count
仍然,如果没有,寻求container[count]
并从那里继续处理。这带来了许多缺点(额外的状态、假设容器不会从前面弹出(!)、随机访问以实现高效查找)。
不是一般情况下。您的想法存在以下一些问题:
- 一些尾后迭代器根本不“指向”数据块;事实上,这将是正确的any除了向量迭代器之外的迭代器。因此,总的来说,现有的结束迭代器永远不会成为数据的有效迭代器;
-
当容器发生变化时,迭代器通常会失效 https://stackoverflow.com/q/6438086/560648- 虽然这并不总是正确的,但它也排除了依赖于在突变之前取消引用某些迭代器的通用解决方案;
- 迭代器的有效性是不可观察的——在取消引用迭代器之前,您已经需要知道它是否有效。这是来自其他地方的信息,通常是你的大脑……我的意思是开发人员必须阅读代码并根据其结构和流程做出决定。
将所有这些放在一起,很明显,由于当前设计的迭代器接口,最终迭代器根本不能以这种方式使用。迭代器引用范围内的数据,而不是容器;那么,按理说,它们不保存有关容器的信息,并且如果容器导致范围更改,则迭代器不知道任何实体可以要求找到它。
所描述的逻辑是否可以创建?当然!但具有不同的迭代器接口(并且来自容器的支持)。您可以将容器包装在您自己的类类型中来执行此操作。然而,我建议不要制作看起来像标准迭代器但行为不同的东西;这会很混乱。
相反,封装容器并提供您自己的包装函数,该函数可以直接执行您认为需要的任何排队后操作。您不需要观察最终迭代器的状态来实现您的目标。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)