SGI STL 迭代器實現

2021-07-27 16:57:29 字數 3279 閱讀 7859

迭代器模式:該模式能夠提供一種方法,使之能夠依序尋訪某個聚合物(容器)所含的每個元素,而又無需暴露該聚合物的內部表達方式。

———————————————————————————————————————— 《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標識, 通過啟用編譯器的過載機制,來抉擇呼叫正確函式。

迭代器的分類:

1、input interator :只允許作為輸入,也就是唯讀(read only)

2、output interator :只允許作為輸出,也就是只寫(write only)

3、forward interator :允許讀寫,但只能做前向移動

4、bidirectional interator :允許讀寫,可以做雙向移動

5、random access interator :允許讀寫,可以任意移動

iterator_category的實現

實際上這個函式是被過載成六個函式的,如下:

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 函式獲取的是乙個容...