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

时间:2008-11-04 08:44:42

标签: c++ list iterator compare

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

5 个答案:

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

答案 1 :(得分:10)

Boost有一个名为next的实用程序(及其反向,prior),仅用于此目的。

*itr == *next(itr)

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

答案 2 :(得分: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)
    {
        //...
    }

请注意,first已使用second first初始化,因此当循环开始时list.begin()list.begin()+1,其次为next

post-incrementation提升有priorlist函数,虽然我不熟悉这些函数(对于我的罪)实现它们是微不足道的(特别是考虑到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) 有双向迭代器)。

next

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


<强>编辑:

  • 修复了由于Chris Jester-Young points out的评论而导致列表为空的错误。
  • 添加对{{1}}的引用以及为什么我认为它不适合此用例。

答案 3 :(得分:1)

List是一个可逆容器,因此它的迭代器是双向迭代器,它是Forward Iterator的模型,我很确定这意味着你可以做到这一点(或类似的东西,如果你对爆发过敏中间循环等。):

if (!l.empty()) {
    for (list<T>::const_iterator i = l.begin();;) {
        const T &a = *i;
        ++i;
        if (i == l.end()) break;
        do_comparison(a, *i);
    }
}

你不能用输入迭代器做到这一点,因为只要你有一个迭代器,这些值只有“存在”。但你可以使用Forward Iterator。

答案 4 :(得分:0)

for (list<int>::iterator it = test.begin(); it!=test.end(); it++) {
        cout<<*it<<":\t";
        list<int>::iterator copy = it;
        for( list<int>::iterator it2 =  ++copy; it2!=test.end();it2++){
            cout<<*it2<<"\t";
        }
        cout<<endl;
    }