7

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

4

5 回答 5

12

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

这些是原型:

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

template <class ForwardIterator, class BinaryPredicate>
   ForwardIterator adjacent_find ( ForwardIterator first, ForwardIterator last,
                                   BinaryPredicate pred );
于 2008-11-04T10:11:56.557 回答
10

为了这个目的, Boost 有一个称为next(及其逆prior)的实用程序。

*itr == *next(itr)

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

于 2008-11-04T08:48:13.013 回答
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初始化的,而第二个是。secondfirstlist.begin()list.begin()+1

Chris Jester-Young 指出boost hasnextpriorfunctions,虽然我不熟悉这些函数(因为我的罪过),但实现它们是微不足道的(特别是考虑到它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) 

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


编辑:

  • 由于Luc Touraille的评论,修复了列表为空的错误。
  • 添加参考next以及为什么我认为它不适合这个用例。
于 2008-11-04T08:57:56.737 回答
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);
    }
}

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

于 2008-11-04T12:32:59.500 回答
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;
    }
于 2015-11-20T18:31:55.893 回答