如何访问C ++列表迭代器循环中的“previous”元素?

时间:2011-04-07 19:17:52

标签: c++ list iterator

我正试图在遍历列表所有元素的循环中访问先前迭代的元素。

更具体地说,我的循环如下所示:

for (iter=list_object.begin(); iter!= list_object_.end(); iter++)
  {
    function_1(*iter);
    function_2(*PREVIOUS_VALUE_IN_THE_LIST);
  }

如何在列表中访问此前一个值?

4 个答案:

答案 0 :(得分:17)

std::list只是双向可互换的,因此您一次只能将迭代器移动一个位置。因此,您需要创建一个新的迭代器:

iter_copy = iter;
--iter;

显然,在减少迭代器之前,你有责任确保前一个元素确实存在。

在C ++ 0x中,此功能整齐地包含在std::prev函数中,您的C ++标准库实现可能支持该函数。如果没有,它看起来像这样:

template <typename BidiIt>
BidiIt prev(BidiIt x, typename std::iterator_traits<BidiIt>::difference_type n=1)
{
    std::advance(x, -n);
    return x;
} 

答案 1 :(得分:15)

一种简单的方法是简单地跟踪for循环中的前一个元素,例如:

for( list_t::iterator iter=obj.begin(), prev=obj.end(); 
    iter != obj.end(); prev=iter, ++iter )
{
  function_1(*iter);
  if( prev != obj.end() )
    function_2(*prev)
}

这适用于只是转发的迭代器,它们不需要是双向

答案 2 :(得分:2)

operator--递减迭代器。

std :: list有一个双向迭代器。 http://www.cplusplus.com/reference/std/iterator/BidirectionalIterator/

答案 3 :(得分:2)

有两种可能性。 --itorstd::advance(itor, -1)