我想获得STL list
迭代器的下一个值,但它没有实现operator+
,vector
有它。为什么以及如何在我想要的地方获得价值?
如果我多次致电operator++
,我想我能做到这一点,但是不是有点脏吗?
我想做的是以下内容:
list<int> l;
...omitted...
list<int>::iterator itr = l.begin() + 3; // but, list iterator does not have
// operator+
什么是我想要的最佳解决方案?
答案 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
使用起来很笨拙(它通过副作用起作用,而不是通过返回副本)。