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

mor*_*lir 13 c++ iterator list

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

更具体地说,我的循环看起来像这样:

for (iter=list_object.begin(); iter!= list_object_.end(); iter++)
  {
    function_1(*iter);
    function_2(*PREVIOUS_VALUE_IN_THE_LIST);
  }
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*lis 18

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

iter_copy = iter;
--iter;
Run Code Online (Sandbox Code Playgroud)

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

在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;
} 
Run Code Online (Sandbox Code Playgroud)


edA*_*a-y 17

一种简单的方法是简单地跟踪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)
}
Run Code Online (Sandbox Code Playgroud)

这将适用于简单转发的迭代器,它们不需要是双向的.

  • 优雅本身! (2认同)