2011-04-07 63 views
11

我試圖訪問循環遍歷列表中的所有元素的循環中以前迭代的元素。如何訪問C++列表迭代器循環中的'previous'元素?

更具體地講,我的循環看起來像這樣:

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

如何在列表中訪問此之前的價值?

+0

只要注意通過循環的第一輪! – 2011-04-07 20:47:59

回答

17

std::list只有bidirecitonally可迭代的,所以你只能移動迭代器一個位置的時間。因此,您需要創建一個新的迭代器:顯然,在減少迭代器之前,您有責任確保前一個元素實際存在。

在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; 
} 
+0

完美,謝謝! – 2011-04-08 09:24:47

2

有兩種可能性。 --itorstd::advance(itor, -1)

12

一個簡單的方法是簡單地跟蹤上一個元素的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) 
} 

這將迭代器這是工作簡單地正向,他們並不需要是雙向

+1

優雅本身! – 2016-01-27 18:04:02

+0

多麼深思熟慮的答案。沒有我甚至意識到它覆蓋基礎案例! – nirvanaswap 2016-03-18 03:46:40

相關問題