为什么只有random-access-iterator在C++中实现operator +?

Hon*_*oon 9 c++ iterator stl

我想为STL list迭代器获取下一个值,但它没有实现operator+,但是它已经实现了vector.为什么以及如何在我想要的地方获得价值?

如果我operator++多次打电话,我想我能做到这一点,但是不是有点脏吗?

我想做的是以下内容:

list<int> l;
...omitted...
list<int>::iterator itr = l.begin() + 3; // but, list iterator does not have
                                         // operator+
Run Code Online (Sandbox Code Playgroud)

什么是我想要的最佳解决方案?

R S*_*hko 37

你想使用std :: advance:

list<int>::iterator itr = l.begin();
std::advance(itr, 3);
Run Code Online (Sandbox Code Playgroud)

advanceoperator+如果迭代器是随机访问,它将在常量时间内使用和完成,如果迭代器不是随机访问,它将循环operator++并在线性时间内完成.  

这样做的原因是让您可以控制复杂性要求.如果你关心你使用的操作的复杂性operator+并得到恒定的时间,但这只能用随机访问迭代器编译.如果您不关心使用的复杂性std::advance,它将始终有效,但复杂性将根据迭代器而有所不同.


Unc*_*ens 17

std::next如果您无法访问C++ 11,也可以使用(和prev)或Boost提供的等价物.

list<int>::iterator itr = std::next(l.begin(), 3);
Run Code Online (Sandbox Code Playgroud)

理由:std::advance使用起来很尴尬(它通过副作用,而不是通过返回副本).

  • 很高兴知道.我总是想知道为什么`std :: advance`通过副作用而不是功能作用. (2认同)