迭代器學習筆記

2021-08-08 03:11:31 字數 2356 閱讀 1401

本文是學習《stl原始碼剖析》時的學習筆記。

迭代器是一種類,其包裝了原生指標,並過載了operator*、operator->、operator!=、operator++等等,因此其行為類似指標。

容器為了儲存各種型別的元素,定義為類模板。與此相似,為了使迭代器能夠指向不同型別的容器元素,迭代器也需要定義為類模板。

不同的容器遍歷方法不同,在過載operator++時,必須根據不同的容器確定。因此,實現迭代器時需要對容器的實現細節有非常豐富的了解。所以容器的設計者需要實現其相應的迭代器。這正是為什麼每一種stl容器都提供了專屬迭代器的緣故。

迭代器相應型別就是迭代器相關的一些型別資訊。常用的迭代器型別有五種:value type、difference type、reference type、pointer type、iterator category;

value type:指迭代器所指物件的型別。

difference type

reference type:如果函式要傳回左值,則返回值型別必須是引用。t&和const t&就是兩種不同的引用型別。

pointer type:顧名思義

iterator category

如果希望自己開發的容器能與stl很好地結合使用,必須為你的容器迭代器定義這五種相應型別。

stl通過迭代器的使用將資料容器和演算法分離開來。演算法使用迭代器而不是容器作為輸入。在演算法中運用迭代器時,很可能會遇到其相應型別!

例如:乙個函式以迭代器為輸入,在函式體內部需要定義以「迭代器所指物件的型別」為型別的臨時變數,這個時候就用到了value type。再例如,乙個函式以迭代器為輸入,需要返回迭代器所指物件的引用,這時候函式返回值型別就用到了reference type。

現在我們知道了迭代器相應型別很有用,那麼該如何定義它呢?

使用內嵌型別宣告是個不錯的解決方案,看下面的例子。

templatet>

struct myiter

在迭代器myiter中宣告了value_type和reference_type,注意,它們只是在類作用域中可見。

template

typename i::value_type //這一行是函式的返回值,typename表明後面是乙個型別名而不是變數

func1(i ite)

template

typename i::reference_type //這一行是函式的返回值,typename表明後面是乙個型別名而不是變數

func2(i ite)

上面func1返回迭代器所指物件的值,func2返回迭代器所指物件的引用。看上去這兩個函式可以處理任意的迭代器(只要它宣告了相應型別)。但現在出現了乙個新的問題:並不是所有的迭代器都是類型別。比如說原生指標就不是,那麼就無法為它定義內嵌型別!

為了解決上面的問題,我們需要加乙個「間接層」。

具體做法是編寫乙個類模板,專門用來「萃取」迭代器的特性(相應型別)。

也就是說,使用乙個模板類來提取迭代器相應型別。

也就是說可以像下面這樣:

template

struct iterator_traits

這個所謂的traits,其意義是,如果i定義有自己的value_type,那麼通過這個traits的作用,萃取出來的value_type就是i::value_type。

原來的func1函式可以如下定義:

template

typename iterator_traits::value_type //這一行是函式的返回值

func1(i ite)

這裡的iterator_traits還是沒有解決原生指標的問題。但是我們可以(必須)為原生指標t*和const t*編寫乙個iterator_traits特例版本,相關技術參考template partial specialization,c++primer16.5小節 模板特例化。

template

struct iterator_traits

template

struct iterator_traits

至此我們成功地解決了獲取原生指標的相應型別的問題!

再次提醒,iterator_traits必須針對傳入的型別為pointer或者point-to-const設計特化版本。

C 迭代器學習筆記

1 istream iterator和ostream iterator的學習 istream iteratorin strm 其中表示輸入型別,strm為istream iterator指向的流 提供了輸入操作符 ostream iteratorout strm 輸出操作符 2.vector rev...

Python學習筆記 迭代器

from collections import iterable from collections import iterator 可迭代物件 可以直接作用於for迴圈的物件統稱為可迭代物件 iterable 可以用isinstance 去判斷乙個物件是否是iterable物件 可以直接作用於for...

C 學習筆記 迭代器

我們都知道可以用下標運算來訪問string物件和vector物件。而另外還有一種更通用的方法也可以實現這樣的方法。名曰 迭代器 iterator 類似於指標,迭代器也提供了對物件的間接訪問。就迭代器而言,其物件是容器中的元素或者string中的字元。使用迭代器可以訪問某個元素,迭代器也能從乙個元素移...