我正试图在遍历列表所有元素的循环中访问先前迭代的元素。
更具体地说,我的循环如下所示:
for (iter=list_object.begin(); iter!= list_object_.end(); iter++)
{
function_1(*iter);
function_2(*PREVIOUS_VALUE_IN_THE_LIST);
}
如何在列表中访问此前一个值?
答案 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)
有两种可能性。 --itor
或std::advance(itor, -1)
。