我試圖訪問循環遍歷列表中的所有元素的循環中以前迭代的元素。如何訪問C++列表迭代器循環中的'previous'元素?
更具體地講,我的循環看起來像這樣:
for (iter=list_object.begin(); iter!= list_object_.end(); iter++)
{
function_1(*iter);
function_2(*PREVIOUS_VALUE_IN_THE_LIST);
}
如何在列表中訪問此之前的價值?
我試圖訪問循環遍歷列表中的所有元素的循環中以前迭代的元素。如何訪問C++列表迭代器循環中的'previous'元素?
更具體地講,我的循環看起來像這樣:
for (iter=list_object.begin(); iter!= list_object_.end(); iter++)
{
function_1(*iter);
function_2(*PREVIOUS_VALUE_IN_THE_LIST);
}
如何在列表中訪問此之前的價值?
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;
}
完美,謝謝! – 2011-04-08 09:24:47
operator--遞減的迭代器。
的std ::列表具有雙向迭代器。 http://www.cplusplus.com/reference/std/iterator/BidirectionalIterator/
有兩種可能性。 --itor
或std::advance(itor, -1)
。
一個簡單的方法是簡單地跟蹤上一個元素的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)
}
這將迭代器這是工作簡單地正向,他們並不需要是雙向。
優雅本身! – 2016-01-27 18:04:02
多麼深思熟慮的答案。沒有我甚至意識到它覆蓋基礎案例! – nirvanaswap 2016-03-18 03:46:40
只要注意通過循環的第一輪! – 2011-04-07 20:47:59