2012-07-12 130 views
0

如何獲取迭代器到STL列表中的倒數第二個元素而不創建臨時並修改列表? 有沒有可能只說:--(--mylist.end())?或者由於前綴遞減,這會改變列表的迭代器endSTL列表訪問倒數第二個元素

+1

你可能想看看這個:http://stackoverflow.com/questions/5322104/how-portable-is-end-iterator-decrement – filmor 2012-07-12 10:16:46

回答

3

請注意,在一般情況下,--mylist.end()不能保證編譯每個集裝箱。

例如,如果你在釋放模式使用std::vectorstd::arraymylist.end()可能是一個原始指針,你不能從遞減函數由返回值的指針。

當然,在檢查列表足夠長之後,C++ 11中針對此問題的通用解決方案是std::prev(std::prev(mylist.end()))。您需要爲此#include <iterator>

+0

以下元素有趣。但爲什麼我不能減少由值返回的指針。這就是爲什麼它不會更改'end'迭代器本身,因爲返回值 – ritter 2012-07-12 10:27:58

+0

因爲對按值返回的函數的調用是右值,但對於標量的函數是「 - 」運算符(如int或raw指針)需要一個左值。只需嘗試'--new T();'你會得到一個編譯器錯誤,說「左值需要作爲遞減操作數」或類似的東西。另一方面,只要將它作爲一個成員函數實現,就可以在臨時對象上調用operator - - 是完全正確的。在實際中,它不適用於* postfix *'--',因爲它通常被實現爲一個自由函數(用前綴'--'來避免代碼重複),而不是成員函數。 – fredoverflow 2012-07-12 10:32:42

2

如果沒事了reverse_iterator,則:some_list.rbegin() + 1;

+1

假設'some_list'是一個'std :: list'迭代器將會不支持'operator +' – pmr 2012-07-12 10:28:31

+1

std :: list支持雙向迭代器;正如Nim所說,只需調用方法rbegin(),並使用operator ++ – Bentoy13 2012-07-12 10:42:20

3

你可以使用std::advance和reverse_iterator的:

SomeContainerType::reverse_iterator it = myList.rbegin(); 
std::advance(it, 1); // next to last element 

這個工程即使有問題的迭代器類型不支持operator+

+1

或者就此而言,一個前向迭代器:'auto it = myList.end(); std :: advance(it,-2);'。 – 2012-07-12 10:53:29

相關問題