如何獲取迭代器到STL列表中的倒數第二個元素而不創建臨時並修改列表? 有沒有可能只說:--(--mylist.end())
?或者由於前綴遞減,這會改變列表的迭代器end
?STL列表訪問倒數第二個元素
回答
請注意,在一般情況下,--mylist.end()
不能保證編譯每個集裝箱。
例如,如果你在釋放模式使用std::vector
或std::array
,mylist.end()
可能是一個原始指針,你不能從遞減函數由返回值的指針。
當然,在檢查列表足夠長之後,C++ 11中針對此問題的通用解決方案是std::prev(std::prev(mylist.end()))
。您需要爲此#include <iterator>
。
以下元素有趣。但爲什麼我不能減少由值返回的指針。這就是爲什麼它不會更改'end'迭代器本身,因爲返回值 – ritter 2012-07-12 10:27:58
因爲對按值返回的函數的調用是右值,但對於標量的函數是「 - 」運算符(如int或raw指針)需要一個左值。只需嘗試'--new T();'你會得到一個編譯器錯誤,說「左值需要作爲遞減操作數」或類似的東西。另一方面,只要將它作爲一個成員函數實現,就可以在臨時對象上調用operator - - 是完全正確的。在實際中,它不適用於* postfix *'--',因爲它通常被實現爲一個自由函數(用前綴'--'來避免代碼重複),而不是成員函數。 – fredoverflow 2012-07-12 10:32:42
你可以使用std::advance和reverse_iterator的:
SomeContainerType::reverse_iterator it = myList.rbegin();
std::advance(it, 1); // next to last element
這個工程即使有問題的迭代器類型不支持operator+
。
或者就此而言,一個前向迭代器:'auto it = myList.end(); std :: advance(it,-2);'。 – 2012-07-12 10:53:29
- 1. 取出倒數第二個元素 - Prolog
- 2. 附加到倒數第二個元素
- 3. 獲取倒數第二個元素
- 4. 選擇倒數第二個元素
- 5. 返回倒數第二個列表元素在共同的lisp
- 6. 如何獲得列表中的倒數第二個元素?
- 7. 如何從列表中查找倒數第二個元素?
- 8. 插入列表元素在倒數第二個位置
- 9. python訪問列表中的第二個元素到最後一個元素
- 10. Java LinkedList訪問第二個元素
- 11. 序言:顛倒列表中的每個第二個列表元素
- 12. 如何訪問cli中倒數第二個命令的第二個參數?
- 13. 如何訪問每個列表的第一個元素列表
- 14. 列表和添加第二個元素
- 15. Python列表從第二個元素
- 16. 加入第一+最後一個元素,第二+倒數第二個元素等爲載體
- 17. 通過第一個表的元素訪問第二個表的屬性
- 18. 在Haskell列表中訪問列表中的第n個元素
- 19. 使用javascript無法訪問第二個表單元素
- 20. 獲得倒數第二個值陣列
- 21. 如何訪問第二個數組中的元素
- 22. 在Jinja2迭代中獲取倒數第二個元素
- 23. 斯卡拉折左找到倒數第二個元素
- 24. 有效檢索Scala中ArrayStack的倒數第二個元素?
- 25. 如何從multi_index_container中獲取倒數第二個元素
- 26. C++ deque迭代到倒數第二個元素
- 27. 我怎樣才能訪問倒數第二個孩子?
- 28. sas倒數第二個&syserrortext
- 29. C#的倒數第二個
- 30. 訪問第二元件在regexp_matches陣列
你可能想看看這個:http://stackoverflow.com/questions/5322104/how-portable-is-end-iterator-decrement – filmor 2012-07-12 10:16:46