如果只有指向要刪除的元素的迭代器,是否可以從std::list
中刪除元素?我有大量的函數需要迭代器來列出元素,並且將自己的list
傳遞給它們中的每一個都是非常不方便的。從列表中刪除元素只有迭代器
回答
編輯:
你不能使用單個迭代器。
如果您有開始/結束迭代器,則可以使用std::remove
算法將要擦除的所有元素移到最後,並在稍後刪除它們。
如果你不這樣做,或者上述方法對你目前的設計是不可行的,我建議改變你的功能,採取std::pair<std::list<T>, std::list<T>::iterator>
或類似的東西。
不,這是不可能的。顧名思義,迭代器的工作就是迭代序列的元素。查看SGI page on iterators,獲取C++標準庫中迭代器設計的摘要。
因爲'list'是一個雙向鏈表,所以你可不寫一個函數來操作'next'和'previous'指針,這樣它就會刪除這個元素?或者這真的很糟糕?還是僅僅是這些成員是私人的? –
@Seth:是的,這在技術上是可行的。例如,在Java中,迭代器具有[remove method](http://download.oracle.com/javase/1.4.2/docs/api/java/util/Iterator.html#remove())。但是,這不是C++迭代器設計的一部分。我想標準委員會更喜歡與其他容器的一致性。 –
@Seth:這可以針對特定供應商庫的特定版本完成。但是,這意味着很多非標準(並且絕對不可移植)的代碼。此外,成員可能是私人的。 –
不,你不能。迭代器是指針之後建模的輕量級對象,並且不會引用它們引用的容器。 (儘管一些實現在調試模式下是內部執行的)。
就像你不能從數組中「移除」一個對象,當你擁有一個指向數組的指針時,你不能從容器中移除一個對象,訪問容器。
你不能做到這一點與標準庫,但您可以使用Boost的侵入名單http://www.boost.org/doc/libs/1_37_0/doc/html/boost/intrusive/list.html其中有這樣的接口。
雖然其他人提到你不能這樣做,我想我可以提供爲什麼。
我相信具體的技術原因(而不是設計理由)是列表做了一些維護,例如跟蹤大小,例如需要某些動作必須通過它們才能進行維護。
正是因爲這個原因,可能會提供的任何破解可能會失敗。
這是一個很好的想法,儘管看起來你可以讓迭代器告訴他們的父列表他們正在刪除自己或某物。 –
- 1. 如何從迭代列表中只刪除一個元素
- 2. Android:使用迭代器從列表中刪除元素
- 3. 如何在迭代時從通用列表中刪除元素?
- 4. 迭代時從stl列表中刪除多個元素
- 5. 列表迭代器刪除()
- 6. Java刪除迭代器,刪除同一列表中的另一個元素
- 7. 刪除元素,並從列表中刪除下列元素
- 8. 刪除迭代中的散列表元素
- 9. 從數組中刪除元素無效迭代器
- 10. 從容器中刪除元素時,通過它們迭代
- 11. java:使用迭代器從arraylist中刪除元素
- 12. 從元組列表中刪除元素
- 13. C++從列表中刪除列表時,迭代列表
- 14. 從python列表中刪除元素
- 15. 如何從列表中刪除元素
- 16. 從鏈接列表中刪除元素
- 17. 從列表中增量刪除元素
- 18. 從python3的列表中刪除元素
- 19. python-從列表中刪除元素
- 20. 從通用列表中刪除元素
- 21. 元素不從列表中刪除
- 22. 從C++列表中刪除元素
- 23. 從鏈接列表中刪除元素
- 24. 從列表中刪除元素
- 25. 從列表元素中刪除項目?
- 26. 從列表中動態刪除元素
- 27. 當試圖從列表中刪除一個元素時,「列表迭代器不兼容」
- 28. 使用迭代器從列表中刪除條目
- 29. 從列表和迭代器問題中刪除對象
- 30. 從元組列表中刪除所有出現的元素
請注意,以這種方式使用迭代器不利於將其用作設計模式,但這並不是說在許多情況下它不是正確的做法(例如通過查看一組元素)。 – Jeremy
http:// stackoverflow.com/questions/596162/can-you-remove-elements-from-a-stdlist-while-iterating-through-it – nielsj
@Jeremy:實際上,它不再是使用迭代器作爲設計模式。但是,它在迭代器失效方面的語義很差。在許多容器中,刪除一個項目會使所有迭代器失效,包括當前用於迭代元素的迭代器。 –