我想在迭代列表时比较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(感谢评论者指出这一点).
最简单的方法是保持两个迭代器(因为你无论如何都必须停在倒数第二个).
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所以当循环开始first是list.begin()和第二个是list.begin()+1.
Chris Jester-Young指出 boost next和prior函数,虽然我不熟悉这些函数(对于我的罪),实现它们是微不足道的(特别是考虑到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().
编辑:
next以及为什么我认为它不适合这个用例.| 归档时间: |
|
| 查看次数: |
5976 次 |
| 最近记录: |