STL 迭代器对结束(过去的结束)迭代器重新验证?

2024-04-02

请参阅有关尾后迭代器失效的相关问题: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(使用前将#替换为@)

STL 迭代器对结束(过去的结束)迭代器重新验证? 的相关文章

随机推荐

  • Meteor - 设置文档标题

    有没有办法改变
  • 如何自动测试基于浏览器的应用程序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如果它是一个Windows程序 我会使用Auto it http www autoitscript com autoit3 index s
  • R data.table 在导出函数中中断

    我在让 data table 在 roxygen2 导出函数中工作时遇到问题 这是一个名为 foo R 位于我的包的 R 目录中 的文件中的一个简单的假函数 它使用 data table Data table test function e
  • jQuery 验证(至少一个字段有文本)

    我的这个页面有几个 TextAreas asp net mvc 我需要验证这些字段中至少有一个包含文本 我怎样才能用 jQuery 做到这一点 这是我拥有的 textAreas 的一个示例 假设您没有使用验证插件并且所有文本区域都有 Esp
  • 在 Prolog 中编辑 Eliza 聊天机器人

    我一直在努力尝试在 Prolog 中编辑 Eliza 聊天机器人 每次我尝试编辑某些内容时 都会出现新的错误 它是否受到任何形式的编辑保护 我使用 SWI prolog 编辑器进行编辑 问题是我试图在没有完全理解代码的情况下最小化代码 我正
  • Java Eclipse 错误“未找到源。”

    我是编程世界的新手 我正在尝试编写一个简单的程序 从文件中读取并输出单个数字 我相信我在代码中设置了所有内容 我是否需要对 txt 文件的位置执行任何特殊操作才能使程序读取该文件 package pack import java util
  • 在Python中将十六进制值转换为RGB值

    在这里处理杰里米的回应 将十六进制颜色转换为 RGB 反之亦然 https stackoverflow com questions 214359 converting hex color to rgb and vice versa我能够获得
  • 接口是否位于继承链中?

    网上有两种说法Interface 那是陈述A 接口不属于继承链 其他声明B 接口可以继承其他接口 http msdn microsoft com en us library ms173156 28v vs 80 29 aspx 这两种说法是
  • NodeJS应用程序出现内存泄漏,它在哪里?

    我有一个 NodeJs 应用程序 它通过 Redis 服务器上的订阅来侦听消息 它会收集 5 秒的消息 然后将它们推送到连接的客户端 代码如下所示 io sockets on connection function socket nClie
  • 在 TypeScript 中实现接口原型

    我创建了一个TypeScript我的服务结果界面 现在我想为里面的两个函数定义一个基本功能 问题是我收到错误 Support 类型的值不存在属性 ServiceResult I use WebStorm为发展 VS2012让我紧张 因为大型
  • 如何合并两个数据框?

    我有一个初始数据框D 我从中提取两个数据帧 如下所示 A D D label k B D D label k 我想结合A and B到一个数据帧中 数据的顺序并不重要 然而 当我们采样时A and B from D 他们保留索引D 已弃用
  • 迭代 python 列表的最佳方法是什么,排除某些值并打印结果

    我是 python 新手 有一个问题 我检查过类似的问题 检查了教程深入Python 检查了 python 文档 googlebinging 类似的 Stack Overflow 问题和十几个其他教程 我有一段 Python 代码 用于读取
  • 创建 GSON 对象

    如何使用 Google Gson 创建 json 对象 以下代码创建一个 json 对象 如下所示 name john JsonObject jsonObject new JsonObject jsonObject addProperty
  • Varnish hit-for-pass 是什么意思?

    Varnish 版本 3 有一些用于不同操作的对象 例如 当它必须从后端检索数据时使用pass 当它在缓存中找到请求内容时使用hit 但我无法理解 hit for pass 的用法 Varnish什么时候使用它 我在网上没有找到任何有用的材
  • 当文件被删除并再次创建时,inotify 停止监视文件

    我在使用inotify时遇到一些问题 我使用 inotify 来监视文件的更改 这是我的代码 int fd inotify init int wd inotify add watch fd root temp IN ALL EVENTS i
  • 用于将 XML 内容解析为类的 LINQ 查询

    我有一个 xml 我试图通过 LINQ 查询从中提取一些信息 xml 文件的格式如下所示
  • 如何使用 pandas 中的自定义权重计算滚动平均值?

    熊猫文档http pandas pydata org pandas docs stable computation html http pandas pydata org pandas docs stable computation htm
  • 如何使用 .gitignore 忽略文件夹中的所有子文件夹

    我在 Git 中有一个文件夹 里面有一些文件 文件是我的 Git 存储库的一部分 运行我的项目时 一些工作目录会出现在该文件夹中 目录可以具有任何名称和任何具有多个子目录的嵌套级别 我想忽略此文件夹中出现的所有可能的子目录 但仍将所有文件
  • 如果密钥不存在,如何插入到 DynamoDb

    我想将 id 一些值添加到 DynamoDb 一次 如果 id 已经存在 则不执行任何操作或更新 我可以和 search if not found gt insert if found gt do nothing or update for
  • STL 迭代器对结束(过去的结束)迭代器重新验证?

    请参阅有关尾后迭代器失效的相关问题 this https stackoverflow com questions 11350454 past the end iterator invalidation in c11 this https s