c++ - 顺序容器和迭代器算术
问题描述
我正在研究顺序容器库,有些事情让我思考。
我已经理所当然地认为每个容器,除了特殊情况,如 forward_list,它不可能在一个方向上,完全支持迭代器算术。相反,我刚刚发现通用容器仅支持一组非常特定的操作:* 和 ->(出于显而易见的原因)、前后递增和递减(不是 100% 确定 post)和等式/不等式关系运算符。为向量、字符串和双端队列保留了更复杂的算术。
我不明白这个约束。我们被禁止的原因是什么,例如,在两个迭代器之间进行减法或在迭代器中添加一个 int?毕竟,如果我们可以访问前/后自增/自减,即使效率低下,我们也可以通过使用整数计数器重复迭代这些操作来轻松实现加法和减法。
解决方案
您提到的缺失的低效操作实际上是可用的,由std::distance
and提供std::advance
。(还有std::prev
和std::next
,出于更微妙的原因。)
不要求所有迭代器或至少所有双向迭代器都支持诸如 之类的东西的原因operator+=
是警告用户他们正在做的事情不如他们预期的那么有效。*(iter+offset)
在循环中编写类似的东西很容易,然后将容器类型从 a 更改std::vector
为 a std::set
,并且不会注意到您不小心将O(n)
操作变成了O(n^2)
一个。
推荐阅读
- javascript - 如何将 node.js 变量传递/访问到 html 文件/模板
- vert.x - Vertx 无法自动处理客户端的内部代码错误
- git - 即使它适用于合并,Git 也无法为交互式变基执行编辑器
- javascript - 在上一个函数完成后和下拉列表中的值更新后调用函数
- reactjs - 我的 redux 数据在页面加载时未加载,并且我的映射函数返回未定义
- google-sheets - 在复杂表中创建 PIE 图
- java - 如何在 JAVA 中使用基于 SHA-256 算法的 Digest 身份验证实现登录
- arrays - 对象数组无法使用 SwiftUI 显示所有变量?
- java - 如何使用 Scanner 类将值添加到数组列表
- connection - Lisp IDE Portacle tells me "lisp connection closed unexpectedly connection broken by remote peer"