首页 > 解决方案 > 顺序容器和迭代器算术

问题描述

我正在研究顺序容器库,有些事情让我思考。

我已经理所当然地认为每个容器,除了特殊情况,如 forward_list,它不可能在一个方向上,完全支持迭代器算术。相反,我刚刚发现通用容器仅支持一组非常特定的操作:* 和 ->(出于显而易见的原因)、前后递增和递减(不是 100% 确定 post)和等式/不等式关系运算符。为向量、字符串和双端队列保留了更复杂的算术。

我不明白这个约束。我们被禁止的原因是什么,例如,在两个迭代器之间进行减法或在迭代器中添加一个 int?毕竟,如果我们可以访问前/后自增/自减,即使效率低下,我们也可以通过使用整数计数器重复迭代这些操作来轻松实现加法和减法。

标签: c++iteratorcontainers

解决方案


您提到的缺失的低效操作实际上是可用的,由std::distanceand提供std::advance。(还有std::prevstd::next,出于更微妙的原因。)

不要求所有迭代器或至少所有双向迭代器都支持诸如 之类的东西的原因operator+=是警告用户他们正在做的事情不如他们预期的那么有效。*(iter+offset)在循环中编写类似的东西很容易,然后将容器类型从 a 更改std::vector为 a std::set,并且不会注意到您不小心将O(n)操作变成了O(n^2)一个。


推荐阅读