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

时间:2010-05-13 18:04:11

标签: c++ stl iterator

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

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

我想做的是以下内容:

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

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

2 个答案:

答案 0 :(得分:37)

您想使用std::advance

list<int>::iterator itr = l.begin();
std::advance(itr, 3);
如果迭代器是随机访问的话,

advance将使用operator+并在常量时间内完成,而它将在operator++上循环,并且如果迭代器不是随机访问则以线性时间完成。

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

答案 1 :(得分:17)

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

list<int>::iterator itr = std::next(l.begin(), 3);

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