2011-02-01 84 views

回答

20

什麼是STL容器的C++規範要求任何STL容器類型都有幾個不同的可用字段。有些像begin()end()是功能,而其他像iterator是類型。這些限制也適用於迭代器。這允許C++模板函數對其參數類型進行內省以查找更多屬性。例如,所有STL迭代器類型都必須定義一個包含編碼其功能類型的iterator_category字段。這樣,STL算法可以根據它們接受的迭代器的功能,具有不同功能的不同實現。一個類的例子是distance函數,它需要兩個迭代器並返回它們之間的空格數。如果輸入是低的ForwardIteratorBidirectionalIterator這可以通過向前推進迭代器並計算在O(n)中運行的步數。如果輸入是RandomAccessIterator,那麼可以減去迭代器以得到O(1)中的結果。

幸運的是,您通常不必明確列出所有typedef。 <iterator>標題中有一個實用程序類型,名爲iterator,它通過許多不同的參數進行參數化。如果您定義自定義迭代器類型,則可以繼承iterator以自動導入所有這些信息。這實際上是讓所有的typedef到位的更快的方式。

至於你需要重載,你需要得到++(前綴和後綴),==!=*(指針引用),並定義->最低限度是什麼運營商。所有迭代器類型都支持這一點。對於雙向迭代器或更高版本,您還應該定義(前綴和後綴)--。最後,對於隨機訪問迭代器,你應該支持[]++=-(備份許多步驟和減去兩個迭代器),-=<><=>=

希望這會有所幫助!

5

儘管@ templattypedef的回答是準確的,也許我可以稍微澄清一下情況。

迭代器通常定義爲容器內的嵌套類。 std::iterator通常用作基類,以便您更輕鬆地定義您的迭代器類。你永遠不會真的使用std::iterator - 它只是爲了使工作更容易一些,特別是減少你需要輸入的代碼量。

+0

謝謝!如果我在代碼中鍵入typedefs,那麼我不需要繼承std :: iterator了? – Sean 2011-02-01 21:06:16

1

儘管使用std::iterator可能有助於typedef s,但它確實無助於實際實施。

Boost.Iterator庫有很多好的東西,我會建議閱讀關於boost::iterator_adaptor,這大大減少了你需要鍵入的代碼量,以在舊的迭代器上定義一個新的迭代器。