【发布时间】:2019-04-19 13:45:01
【问题描述】:
这更多的是一个设计问题,即是否存在(在 STL 或其他地方)过去的迭代器“重新验证”这样的概念?
我的意思和用例:假设一个算法需要“尾随”一个容器(例如队列)。它遍历容器直到到达end(),然后暂停;与此无关,程序的另一部分将更多项目排入队列。算法怎么可能(编辑)有效地告诉“有更多的项目已入队”,同时持有以前的结束迭代器(称之为tailIt)? (这意味着它能够检查tailIt == container.end() 是否仍然, 如果这是错误的,则得出结论tailIt 现在有效并指向插入的第一个元素)。
请不要将这个问题视为“不,没有” - 我正在寻找关于如何以惯用方式设计一些逻辑的判断,并且有很多选择(实际上有问题的迭代器是到我可以提供此属性的手工构建的数据结构 - end() revalidation - 但我想判断这是否是个好主意)。 p>
编辑:明确我们有迭代器tailIt 和对container 的引用。我正在尝试做的一个简单的解决方法是,还记得count := 您处理了多少项目,然后检查仍然是container.size() == count,如果不是,请寻求container[count] 并从那里继续处理。这带来了许多缺点(额外的状态,假设容器不会从前面弹出(!),随机访问以实现高效搜索)。
【问题讨论】:
-
简单的例子。假设您有一个
std::vector<T>和一个迭代器T* p,它们是指向末尾的原始指针(= end())。然后你在没有重新分配的情况下扩展向量。如果你只有p的值,你能确定向量是否被扩展了吗? -
谢谢 - 你不会,但我需要澄清一些事情。你也有容器
c,所以你可以问p == c.end()还在吗?对于向量情况,只有没有重新分配,p 才会指向第一个新插入的元素。编辑问题。
标签: c++ algorithm stl iterator invalidation