【发布时间】:2019-01-30 19:52:03
【问题描述】:
我正在研究顺序容器库,有些事情让我想到了。
我已经理所当然地认为每个容器,除了特殊情况,如 forward_list,它不可能在一个方向上,完全支持迭代器算术。相反,我刚刚发现通用容器仅支持一组非常特定的操作:* 和 ->(出于显而易见的原因)、前后递增和递减(不是 100% 确定 post)和等式/不等式关系运算符。为向量、字符串和双端队列保留更复杂的算术。
我不明白这个限制。我们被禁止的原因是什么,例如,在两个迭代器之间进行减法或在迭代器中添加一个 int?毕竟,如果我们可以访问前/后自增/自减,即使效率低下,我们也可以通过使用整数计数器重复迭代这些操作来轻松实现加法和减法。
【问题讨论】:
-
你回答了你自己的问题:"...我们可以轻松,即使效率低下..." 。如果你想这样做,你可以,但标准容器试图让你知道这可能是一个坏主意。
-
有不同的iterator categories。在非随机访问迭代器上,算术被禁用(可能),因为它通常具有非常量的复杂性,并且如果使用不当可能会减慢您的程序。要对任意迭代器进行算术运算,请使用
std::next、std::prev、std::advance、std::distance等。 -
“轻松,即使效率低下”,这正是关键所在。 C++ 不希望低效的东西容易与高效的东西混淆。
-
您可能还想了解std::next、std::prev、std::advance 和std::distance,以获得不涉及直接指针/迭代器算法的通用解决方案。只是说。
标签: c++ iterator containers