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

时间:2010-09-09 04:00:18

标签: c++ stl iterator

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

例如在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

6 个答案:

答案 0 :(得分: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;
}

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

if (iter != mySet.end() && next(iter) != mySet.end() && *next(iter) == *iter + 1)
    mySet.erase(iter);

答案 1 :(得分:15)

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

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

所以你的窥视代码:

set <int>::iterator dupe = iter;
++dupe;
// (do stuff with dupe)

答案 2 :(得分:3)

set <int>::iterator iter2 = iter;
++iter2;
int peekedValue = *iter2;

答案 3 :(得分:0)

您始终可以制作迭代器的副本并推进副本:

set <int>::iterator iter = mySet.begin();
set <int>::iterator iterCopy = iter;
iterCopy++;
if (*iterCopy == something)
  mySet.erase(iter);

但请注意,一旦删除iterCopyiter可能不再有效。

答案 4 :(得分:0)

对于序列容器(vector,deque和list),你可以调用front来查看(这个link下半部分的更多信息)。

答案 5 :(得分:0)

这对std::set不起作用,因为它的性质不允许使用[]运算符,但对于容器,你可以这样做:

std::vector<int> v;
v.push_back(3);
v.push_back(4);
std::vector<int>::iterator it = v.begin(); 
std::cout << v[it - v.begin() + 1];

但如果it指向容器中的最后一个元素,那么这可能会很危险;但同样适用于上述解决方案。例如。你必须在两种情况下进行检查。