c++ - 结束(结束后)迭代器的 STL 迭代器重新验证?

标签 c++ algorithm stl iterator invalidation

请参阅有关尾后迭代器失效的相关问题: this , this .

这更多是一个设计问题,即是否存在(在 STL 或其他地方)past-the-end 迭代器“重新验证”这样的概念?

我的意思和用例:假设算法需要“跟踪”容器(例如队列)。它遍历容器直到到达end(),然后暂停;独立于此,程序的另一部分将更多项目放入队列中。算法如何在保持之前的尾端迭代器(称之为 tailIt)的同时,有效地告诉“有更多的项目被排队” ? (这意味着它能够检查 tailIt == container.end() still, 并且如果那是假的,则得出结论 tailIt 是现在有效并指向插入的第一个元素)。

请不要将问题视为“不,没有”——我正在寻找关于如何以惯用方式设计一些逻辑的判断,并且有很多选择(事实上,有问题的迭代器是到我可以为其提供此属性的手工构建的数据结构 - end() 重新验证 - 但我想判断这是否是个好主意)。


编辑:明确表示我们有迭代器tailIt container 的引用。我正在尝试做的一个简单的解决方法是,还要记住 count := 你处理了多少项目,然后检查是 container.size() == count仍然,如果不是,则寻求 container[count] 并从那里继续处理。这带来了许多缺点(额外的状态,假设容器不会从前面弹出(!),随机访问以进行高效查找)。

最佳答案

一般不会。以下是您的想法的一些问题:

  • 一些尾后迭代器根本不“指向”数据 block ;事实上,除了 vector 迭代器之外,这对任何 迭代器都是正确的。因此,总的来说,现存的结束迭代器永远不会成为数据的有效迭代器;
  • Iterators often become invalidated when the container changes — 虽然这并不总是正确的,但它也排除了依赖于从突变之前取消引用某些迭代器的通用解决方案;
  • 迭代器有效性是不可观察的——在取消引用迭代器之前,您已经需要知道它是否有效。这是来自其他地方的信息,通常是您的大脑……我的意思是开发人员必须阅读代码并根据其结构和流程做出决定。

将所有这些放在一起,很明显,结束迭代器根本不能以这种方式使用,因为当前设计了迭代器接口(interface)。迭代器引用范围内的数据,而不是容器;那么,按理说,它们不包含有关容器的信息,如果容器导致范围发生变化,则迭代器不知道它可以要求找出这个实体的任何实体。

是否可以创建所描述的逻辑?当然!但是具有不同的迭代器接口(interface)(以及来自容器的支持)。您可以将容器包装在您自己的类类型中来执行此操作。但是,我建议不要制作看起来像标准迭代器但行为不同的东西;这将非常困惑。

相反,封装容器并提供您自己的包装函数,可以直接执行您认为需要的任何入队后操作。您无需查看结束迭代器的状态即可实现您的目标。

关于c++ - 结束(结束后)迭代器的 STL 迭代器重新验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53336685/

相关文章:

c++ - C++ STL 中的正则表达式

c++ - 为什么程序员有时引用 "C++/STL"就像它是一种单独的语言一样?

C++ 结束这个 8 位 for 循环的最佳方法是什么

algorithm - 快速整数坐标在以原点为中心、半径为 r 的圆内/沿圆

c++ - 优化标准迭代算法

algorithm - 需要帮助迭代数组,检索两种可能性,不重复,用于 Poker AI

c++ - std::regex 在字符串中的括号内查找单词,然后替换它(和括号)

c++ - Qt:qmake中VERSION和VER_MAJ、VER_MIN、VER_PAT的区别

c++ - InterviewStreet 查找字符串

python - 如何在 ubuntu 中将 xBox kinect 连接到 opencv?