查看STL容器中的下一个元素

use*_*241 18 c++ iterator stl

是否有可能在迭代器当前指向的容器中查看下一个元素而不更改迭代器?

例如在std :: set中,

int myArray[]= {1,2,3,4};
set <int> mySet(myArray, myArray+4);
set <int>::iterator iter = mySet.begin();

//peek the next element in set without changing iterator.

mySet.erase(iter); //erase the element if next element is n+1
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 25

C++ 0x添加了一个方便的实用程序函数,std::next它复制迭代器,使其前进,并返回高级迭代器.您可以轻松编写自己的std::next实现:

#include <iterator>

template <typename ForwardIt>
ForwardIt next(ForwardIt it, 
               typename std::iterator_traits<ForwardIt>::difference_type n = 1)
{
    std::advance(it, n);
    return it;
}
Run Code Online (Sandbox Code Playgroud)

你可以在你的例子中使用它,如下所示:

if (iter != mySet.end() && next(iter) != mySet.end() && *next(iter) == *iter + 1)
    mySet.erase(iter);
Run Code Online (Sandbox Code Playgroud)

  • +1,不知道被采纳了.顺便说一句,`++ move(iter)`做同样的事情. (3认同)
  • @zhangxaochen:C++0x 是 C++11 的工作标题(在计划推迟之前,他们虽然会在 2010 年之前发布);C++0x 和 C++11 真的是同一个意思。 (2认同)

Ada*_*erg 16

一般不使用迭代器.不保证迭代器能够非破坏性地运行.典型的例子是一个输入迭代器,它实际上代表了一个底层输入流.

但是,有些东西适用于这种迭代器.一个前向迭代器不通过收集向前移动的行为无效的自身以前的副本.大多数迭代器(包括STL集合的迭代器)至少是正向迭代器,如果不是更多功能版本,则输入迭代器或输出迭代器更受限制.因此,您只需复制迭代器,增加副本并检查它,然后返回到原始迭代器.

所以你的窥视代码:

set <int>::iterator dupe = iter;
++dupe;
// (do stuff with dupe)
Run Code Online (Sandbox Code Playgroud)