迭代器模式:該模式能夠提供一種方法,使之能夠依序尋訪某個聚合物(容器)所含的每個元素,而又無需暴露該聚合物的內部表達方式。它其實就是演算法與容器的一種粘膠劑。———————————————————————————————————————— 《stl原始碼剖析》
迭代器的行為非常類似智慧型指標(smartpointer),所以對他來說最重要的便是deference(內容提領)和member access(成員訪問)。那就是*
操作符和->
操作符的過載了。關於這兩個操作符的過載可以參考stl中auto_ptr
的實現。
tralts就像是「原味特性萃取機」,萃取相應型別的特性。利用「內嵌型別」程式設計技巧和編譯器的「template引數推導功能」增強了c++型別認證方面的能力。
// 用於traits出迭代其所指物件的型別
template
struct iterator_traits
;
//內嵌型別機制(以value_type 為例)
template
struct myiter
t& operator*() const
};template
typename i::value_type // func返回值型別
func(i iter)
void testiteratorstlvaluetype()
關於模板推導詳見
value type 是指迭代器所指物件的型別。
difference type用來表示兩個迭代器之間的距離的型別,例如容器的容量。
在c++中,函式如果要傳回左值,都是以by reference 的方式進行,所以如果p是乙個迭代器,他的value type 是t,那麼*p應該是t&(即reference type)。item& 就是reference_type。
item& operator*()const
item* operator->()const
用來產生tag標識, 通過啟用編譯器的過載機制,來抉擇呼叫正確函式。iterator_category的實現迭代器的分類:
1、input interator :只允許作為輸入,也就是唯讀(read only)
2、output interator :只允許作為輸出,也就是只寫(write only)
3、forward interator :允許讀寫,但只能做前向移動
4、bidirectional interator :允許讀寫,可以做雙向移動
5、random access interator :允許讀寫,可以任意移動
實際上這個函式是被過載成六個函式的,如下:
inline output_iterator_tag iterator_category(const output_iterator&);
template
inline input_iterator_tag
iterator_category(const input_iterator&);
template
inline forward_iterator_tag
iterator_category(const forward_iterator&);
template
inline bidirectional_iterator_tag
iterator_category(const bidirectional_iterator&);
template
inline random_access_iterator_tag
iterator_category(const random_access_iterator&);
template
inline random_access_iterator_tag iterator_category(const t*);
呼叫過程,如下:void __reverse(bidirectionaliterator first, bidirectionaliterator last,
bidirectional_iterator_tag)
template
void __reverse(randomaccessiterator first, randomaccessiterator last,
random_access_iterator_tag)
template
inline void reverse(bidirectionaliterator first, bidirectionaliterator last)
原理:實現過程:它就像是我們呼叫int()會產生什麼? 對會產生乙個臨時變數。參見
template
inline
typename iterator_traits::iterator_category
iterator_category(const iterator&)
//自定義的迭代器必須定義的五種型別
template
struct iterator
;//把之前的五種合併在乙個traits中
template
struct iterator_traits
;//原生指標偏特化版
template
struct iterator_traits;
//const原生指標偏特化版
template
struct iterator_traits
;
SGI STL 迭代器解析
整理至侯捷 stl原始碼剖析 迭代器是一種設計模式,現在程式語言基本都語言層面支援了這種模式,定義如下 提供一種方法,使之能遍歷聚合物 容器 中的各個元素,而又不暴露聚合物內部的實現細節。在stl中,迭代器在容器和演算法之間扮演著橋梁的作用,演算法通過迭代器訪問容器中的資料。迭代器要實現下面幾個功能...
sgi stl 特性萃取器
1 迭代器相關型別的萃取 iterator traits 許多演算法,如查詢,指標移動等都傳遞的是迭代器,而不同迭代器的型別決定了其演算法操作過程的差異 template struct iterator traits 針對原生指標型別,常量指標型別的的迭代器的萃取偏化版本,注意指標型別的迭代器是隨機...
SGI STL紅黑樹中迭代器的邊界值分析
一段程式最容易出錯的就是在判斷或者是情況分類的邊界地方,所以,應該對於許多判斷或者是情況分類的邊界要格外的注意。下面,就分析下stl中紅黑樹的迭代器的各種邊界情況。注意 分析中stl使用的版本是sgi stl,由於不同的版本的stl具體實現細節不一樣,所以可能會有出入 begin 函式獲取的是乙個容...