比较std :: list中的两个连续元素

7 c++ iterator compare list

我想在迭代列表时比较std :: list中的两个连续元素.当我的迭代器在元素i时,访问元素i + 1的正确方法是什么?谢谢科贝

Nic*_*lli 12

STL提供的adjacent_find()算法可用于查找两个连续的相等元素.还有一个带有自定义谓词的版本.

这些是原型:

template <class ForwardIterator>
   ForwardIterator adjacent_find ( ForwardIterator first, ForwardIterator last );

template <class ForwardIterator, class BinaryPredicate>
   ForwardIterator adjacent_find ( ForwardIterator first, ForwardIterator last,
                                   BinaryPredicate pred );
Run Code Online (Sandbox Code Playgroud)


Chr*_*ung 10

为此next,Boost有一个名为(及其反转prior)的实用程序.

*itr == *next(itr)
Run Code Online (Sandbox Code Playgroud)

编辑:但是,如果我们退一步看看森林,真正的问题是,为什么要自定义编写你的adjacent_find功能?(我推荐Nicola Bonelli的答案被接受.)这是STL的一部分,如果你的代码不使用Boost,则不需要使用Boost(感谢评论者指出这一点).


Mot*_*tti 8

最简单的方法是保持两个迭代器(因为你无论如何都必须停在倒数第二个).

std::list<int>::const_iterator second = list.begin(),
                               end = list.end();

if ( second != end ) // Treat empty list
    for(std::list<int>::const_iterator first = second++; // Post-increment 
        second != end; 
        ++first, ++second)
    {
        //...
    }
Run Code Online (Sandbox Code Playgroud)

请注意,first与初始化增量后second所以当循环开始firstlist.begin()和第二个是list.begin()+1.

Chris Jester-Young指出 boost nextprior函数,虽然我不熟悉这些函数(对于我的罪),实现它们是微不足道的(特别是考虑到list具有双向迭代器).

template <class Iterator>
Iterator next(Iterator i) // Call by value, original is not changed
{ 
    return ++i;
}
// Implementing prior is left as an exercise to the reader ;o) 
Run Code Online (Sandbox Code Playgroud)

我的感觉是使用next不包括这个问题以及维护两个迭代器,因为你必须记住确保在每次使用时next(i)都不相等end().


编辑:

  • 通过Luc Touraille的评论修复了列表为空的错误.
  • 添加引用next以及为什么我认为它不适合这个用例.