4
it++;                       // OK    : Widely used expression for moving iterator.

it_prev = it-1;             // ERROR : What I expected; + - operators never existed
it_prev = std::prev(it)     // OK

it_next3 = it+3;            // ERROR : also, nothing like this exists
it_next3 = std::next(it,3)  // OK

为什么 Iterator 类没有 + - 运算符作为成员函数?

或者std::prev()作为一个成员函数来做到这一点?

it_prev = it.prev()         // nothing like this

prev定义迭代器外部的函数是否有特殊原因?

4

2 回答 2

5

如果prev()成员函数而不是自由函数,那么它的通用性会降低,因为无法将内置类型(例如指针)用作迭代器:

int *ptr = ...
// ...
ptr.prev() // <-- Pointers don't have member functions!!

而对于非成员函数 template,例如std::prev(),它与指针一起工作所需要的只是一个处理指针的特化:

int *ptr = ...
// ...
std::prev(ptr); // <-- OK

指针还支持递增递减运算符(即++--),因此在迭代器类中定义它们不会妨碍泛型编程。同样的推理也适用于二元运算符+-

于 2019-11-30T16:39:15.160 回答
2

随机访问迭代器确实已经operator+重载。但其他人不这样做,因为类似的东西it + n会具有线性复杂性,并且大多数人并不期望这一点,特别是考虑到迭代器也意味着 STL 容器的指针式。这也是他们没有调用成员函数的原因,prev因为指针是有效的迭代器实现非常方便、高效和理想。如果你想推进迭代器并且不介意复杂性,你可以明确地做到这一点std::advance

标准::提前

[...]

给定迭代器的增量为 n 个元素。

如果 n 为负数,则迭代器递减。在这种情况下, InputIt 必须满足 LegacyBidirectionalIterator 的要求否则行为未定义。

[...]

复杂

线性的。
但是,如果 InputIt 还满足 LegacyRandomAccessIterator 的要求, 复杂性是恒定的。

于 2019-11-30T16:47:20.913 回答