C++STL 學習 之 迭代器(iterators)
首先要明確迭代器是一個抽象的設計概念,是一種設計模式. Design Patterns 一書中對 Iterators模式的定義如下:提供一種方法,使之能夠依序訪問某個容器所包含的各個元素,而無需暴露該容器的內部表達方式,也就是說,Iterators的實現依賴于具體的容器,是針對某種容器特別設計的,只是對外提供一套統一的訪問接口.
此外,STL的設計思想就是將數據容器和算法分離,彼此獨立設計,最后用一種方式將他們粘合在一起,而Iterators便是這其間的粘合劑.從這個角度看,Iterators設計模式正好可以勝任該目標.
1.STL中 Iterators 的設計思路
迭代器本質是一種智能指針,是一種類似指針的對象,因此,對迭代器的設計主要是實現解引用()和成員訪問(->),所以,主要的編程工作就是對operatorhe operator->進行重載
2.迭代器的相應型別(associated types)
迭代器的相應型別指的是迭代器所指之物的類型。
思考:假如要聲明一個變量,該變量的類型是迭代器所指對象的類型,如何聲明?解決辦法:利用函數模板中的參數推導機制。
3. Traits(特性萃取)編程技巧
為了解決如何斷定迭代器所指之物的類型問題,相應型別無法完美解決,引入Traits技巧
如何實現?
(1)首先,在類模板中聲明一個內置類型:typedef T value_type
(2)針對原生指針,利用模板偏特化(對部分模板參數進一步限制)技術(因為原生指針無法定義內嵌類型)
(3)特性萃取實現:
template <class I>
struct iterator_traits {
typedef typename I::value_type value_type
}
偏特化實現:
template <class I>
struct iterator_traits<T*> {
typedef T value_type
}
(4)總結一下迭代器的實現:首先,對應的容器內部要實現一個內置類型,表示其存儲對象的類型,這是一個約定;然后,針對迭代器不同的相應型別,利用Traits技術和偏特化技術(兼容)實現特性萃取結構體(間接封裝一層,就是為了用偏特化兼容所有類型);最后,通過萃取結構體就可以萃取出迭代器所指之物的類型,達到目的。
4. 迭代器的五種主要相應型別(特性)
(1)value type:迭代器所指對象的類型
(2)difference type:用來表示兩個迭代器之間的距離,因此可以用來表示一個迭代器的最大容量
(3)reference type:如果p是一個mutable Iterators,如果其value type為T,那么p的類型應該是T&,不應該是T(因為對于mutable變量返回的應該是左值而不是右值),同理,如果p是const Iterators,那么p類型應該為const T&
(4)pointer type:類似reference type,只不過指針類型指的是地址
(5)Iterator category:迭代器的種類類型

繼承的作用:無論客戶端傳入哪種類型的迭代器,實際調用的都只是被繼承(父類)的類型。
迭代器都可以繼承它

浙公網安備 33010602011771號