[英]What are the shortcomings of std::reverse_iterator?
boost的專用迭代器適配器的文檔聲明boost::reverse_iterator
“糾正了C ++ 98的std :: reverse_iterator的許多缺點。”
這些缺點是什么? 我似乎無法找到這些缺點的描述。
后續問題:
boost :: reverse_iterator如何糾正這些缺點?
好吧,最大的問題是它們不是前向迭代器,並且有些東西非常期待前向迭代器。 所以,你必須做一些有趣的轉換才能讓事情發揮作用。 列舉一些問題
某些版本的erase()
和insert()
需要迭代器而不是反轉迭代器。 這意味着如果你正在使用反向迭代器並且想要insert()
或erase()
,那么你將不得不使用反向迭代器的base()
函數來獲得前向迭代器。 沒有自動轉換。
base()
在插入方面返回等價於反向迭代器的前向迭代器。 也就是說,在當前元素的前面插入插入。 因此,如果base()
給你一個指向同一元素的迭代器,那么反向迭代器指向的元素將是指向的錯誤元素。 因此,它指向一個前進,您可以使用它進行插入。
因為base()
返回指向不同元素的迭代器,所以它是用於erase()
的錯誤元素。 如果從base()
調用迭代器上的erase()
,則從反向迭代器指向的元素中刪除容器中的一個元素,因此在調用base()
之前必須遞增反向迭代器以便獲取正確的前向迭代器以用於erase()
。
是否甚至可以使用帶有erase()
base()
來正確擦除元素完全取決於您的實現。 它適用於gcc,但是使用Visual Studio時,它們實際上只是以一種方式包裝一個前向迭代器,以便在處理反向迭代器和Visual Studio時不能使用erase()
。 我不記得insert()
是否有相同的問題,但反向迭代器在C ++的不同實現之間不起作用(根據Visual Studio人員,標准不夠清晰),所以它可以是友好的毛茸茸的用於除了簡單地迭代容器之外的任何東西。
可能還有其他問題,但是除了簡單地迭代容器之外,在C ++中處理除了非const,forward迭代器之外的任何類型的迭代器都會有點毛茸茸 - 如果你甚至可以做到這一點 - 因為這么多函數需要非const前向迭代器而不是任何其他類型的迭代器。
如果您真的想知道各種迭代器類型之間的差異以及與它們相關的問題,我建議您閱讀Scott Meyer的Effective STL 。 它有一個關於迭代器的偉大章節。
編輯:至於Boost的反向迭代器如何糾正這些缺點,我擔心我沒有線索。 我知道一些標准的反向迭代器的缺點,過去曾被它們咬過,但我從未使用過很多Boost,所以我根本不熟悉它們的反向迭代器。 抱歉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.