49

假设我有一个std::list<int> lst和一些std::list<int>::iterator it用于迭代列表。并取决于it我要使用的值it + 1it - 1我的代码中的值。有什么好的方法可以做到这一点next()prev()(我在 stl 文档中找不到这样的东西)?还是我应该it每次复制并增加(减少)副本?

4

3 回答 3

50

是的,因为 C++11 有您正在寻找的两种方法称为std::prevstd::next. 您可以在迭代器库中找到它们。

来自 cppreference.com 的示例

#include <iostream>
#include <iterator>
#include <vector>

int main() 
{
    std::list<int> v{ 3, 1, 4 };

    auto it = v.begin();

    auto nx = std::next(it, 2);

    std::cout << *it << ' ' << *nx << '\n';
}

输出:

3 4
于 2012-04-13T08:04:32.517 回答
20

复制和增加/减少副本是唯一可以完成的方法。

您可以编写包装函数来隐藏它(正如答案中提到的,C++11 有 std::prev/std::next 可以做到这一点(并且 Boost 定义了类似的函数)。但它们是围绕这个“复制和增量”操作,所以你不必担心你做错了。

于 2012-04-13T08:37:58.617 回答
6

一个简单的预先确定的解决方案是priornext来自Boost.utility。他们利用operator--operator++不要求您创建临时文件。

于 2012-04-13T08:03:32.580 回答