如何获取std :: list中的next(previous)元素而不递增(递减)迭代器?

Mih*_*yan 45 c++ iterator list

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

inf*_*inf 47

是的,因为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';
}
Run Code Online (Sandbox Code Playgroud)

输出:

3 4
Run Code Online (Sandbox Code Playgroud)

  • 当然,如果你没有C++ 11,它们很容易实现.(我想我们大多数人在他们甚至为C++ 11提出之前都已将它们放在我们的工具包中.) (4认同)

jal*_*alf 20

复制和递增/递减副本是唯一可以完成的方法.

你可以编写包装器函数来隐藏它(正如答案中提到的,C++ 11有std :: prev/std :: next,它就是这样做的(而Boost定义了类似的函数).但是它们是这个"副本"的包装器.增加"操作,所以你不必担心你做错了".


Ben*_*ier 6

一个简单的预先解决方案来自prior和.他们利用和,但不要求你创建一个临时的.nextBoost.utilityoperator--operator++

  • 当然应该提到的是1.他们自己创造了临时性的2.你最好注意边界条件. (2认同)