的迭代我很困惑與如何定義我自己的迭代一些概念:定義我自己的容器
從這:http://www.cs.northwestern.edu/~riesbeck/programming/c++/stl-iterator-define.html,這似乎是使用內部迭代器類定義了運營商提出。許多其他人繼承基類iterator
以重新定義運營商。
我很困惑應該使用哪種方法。爲什麼有
typedef ptrdiff_t difference_type;
例如,在容器類定義的開始?
非常感謝!
的迭代我很困惑與如何定義我自己的迭代一些概念:定義我自己的容器
從這:http://www.cs.northwestern.edu/~riesbeck/programming/c++/stl-iterator-define.html,這似乎是使用內部迭代器類定義了運營商提出。許多其他人繼承基類iterator
以重新定義運營商。
我很困惑應該使用哪種方法。爲什麼有
typedef ptrdiff_t difference_type;
例如,在容器類定義的開始?
非常感謝!
什麼是STL容器的C++規範要求任何STL容器類型都有幾個不同的可用字段。有些像begin()
和end()
是功能,而其他像iterator
是類型。這些限制也適用於迭代器。這允許C++模板函數對其參數類型進行內省以查找更多屬性。例如,所有STL迭代器類型都必須定義一個包含編碼其功能類型的iterator_category
字段。這樣,STL算法可以根據它們接受的迭代器的功能,具有不同功能的不同實現。一個類的例子是distance
函數,它需要兩個迭代器並返回它們之間的空格數。如果輸入是低的ForwardIterator
或BidirectionalIterator
這可以通過向前推進迭代器並計算在O(n)中運行的步數。如果輸入是RandomAccessIterator
,那麼可以減去迭代器以得到O(1)中的結果。
幸運的是,您通常不必明確列出所有typedef。 <iterator>
標題中有一個實用程序類型,名爲iterator
,它通過許多不同的參數進行參數化。如果您定義自定義迭代器類型,則可以繼承iterator
以自動導入所有這些信息。這實際上是讓所有的typedef
到位的更快的方式。
至於你需要重載,你需要得到++
(前綴和後綴),==
,!=
,*
(指針引用),並定義->
最低限度是什麼運營商。所有迭代器類型都支持這一點。對於雙向迭代器或更高版本,您還應該定義(前綴和後綴)--
。最後,對於隨機訪問迭代器,你應該支持[]
,+
,+=
,-
(備份許多步驟和減去兩個迭代器),-=
,<
,>
,<=
和>=
。
希望這會有所幫助!
儘管@ templattypedef的回答是準確的,也許我可以稍微澄清一下情況。
迭代器通常定義爲容器內的嵌套類。 std::iterator
通常用作基類,以便您更輕鬆地定義您的迭代器類。你永遠不會真的有使用std::iterator
- 它只是爲了使工作更容易一些,特別是減少你需要輸入的代碼量。
儘管使用std::iterator
可能有助於typedef
s,但它確實無助於實際實施。
Boost.Iterator庫有很多好的東西,我會建議閱讀關於boost::iterator_adaptor,這大大減少了你需要鍵入的代碼量,以在舊的迭代器上定義一個新的迭代器。
謝謝!如果我在代碼中鍵入typedefs,那麼我不需要繼承std :: iterator了? – Sean 2011-02-01 21:06:16