SGI STL 迭代器解析

2021-08-16 23:43:47 字數 3566 閱讀 7398

整理至侯捷《stl原始碼剖析》

迭代器是一種設計模式,現在程式語言基本都語言層面支援了這種模式,定義如下:提供一種方法,使之能遍歷聚合物(容器)中的各個元素,而又不暴露聚合物內部的實現細節。

在stl中,迭代器在容器和演算法之間扮演著橋梁的作用,演算法通過迭代器訪問容器中的資料。迭代器要實現下面幾個功能:

萃取機制

由於演算法中可能要用到用迭代器所指物件的型別來宣告乙個變數,這個時候該怎麼辦?注意c++中rtti中的typeid()只能獲得型別名稱,不能用來做變數宣告用。為此stl中實現了萃取機制。

template t>

void func_impl(i iter, t t)

template inline void func(i iter)

int main()

template t>

struct myiter

t& operator*() const

//...

};template typename i::value_type

func(i ite)

//...

myiterite(new int(8));

cout << func(itr);

template

struct iterator_traits ;

template

typename iterator_traits::value_type

func(i ite)

下面對於原生指標實現偏特化版本

template

struct iterator_traits//指向指標的偏特化版

template

struct iterator_traits //指向常數物件的指標的偏特化版

stl中常用的迭代器相應型別:value_type,difference_type,pointer,reference,iterator_category。

template

struct iterator_traits ;

template

struct iterator_traits<_tp> ;

template

struct iterator_traits ;

前面四個型別都較簡單,下面分析下iterator_category:

根據移動特性,迭代器可以分為5種:

input iterator:輸入型迭代器,唯讀;

output iterator:輸出型迭代器,只寫;

forward iterator:單向迭代器,單向讀寫;

bidirectional iterator:雙向迭代器,雙向讀寫;

random acess iterator:隨機訪問迭代器,隨機讀寫;

注意這裡不是繼承關係,而是概念與強化關係。stl在設計時,效率一直是首位,如果某個演算法可接受forward iterator,而給它乙個random acess iterator,可以使用,但效率不一定是最佳的。所以要萃取出迭代器的種類。

以advanced()為例:

template

inline

void __advance(_inputiter& __i, _distance __n, input_iterator_tag)

template

inline

void __advance(_bidirectionaliterator& __i, _distance __n,

bidirectional_iterator_tag)

template

inline

void __advance(_randomaccessiterator& __i, _distance __n,

random_access_iterator_tag)

template

inline

void advance(_inputiterator& __i, _distance __n)

__advance(_inputiter& __i, _distance __n, input_iterator_tag);

__advance(_bidirectionaliterator& __i, _distance __n, bidirectional_iterator_tag);

__advance(_randomaccessiterator& __i, _distance __n,random_access_iterator_tag);

上面三組模板函式構成過載函式,注意這裡前兩個引數都為模板引數,在執行時才能決定,不能構成過載機制,所以新增第三個引數來構成過載機制。

struct input_iterator_tag {};

struct output_iterator_tag {};

struct forward_iterator_tag : public input_iterator_tag {};

struct bidirectional_iterator_tag : public forward_iterator_tag {};

struct random_access_iterator_tag : public bidirectional_iterator_tag {};

只需要型別定義,只為了啟用過載機制,構成繼承關係只為消除單純的傳遞呼叫。

對外提供advance(_inputiterator& __i, _distance __n)介面,接受迭代器引數和偏移量引數,然後轉呼叫__advance(__i, __n, iterator_category(__i)),通過iterator_category(__i)萃取出迭代器型別從而呼叫不同的過載模板函式。

iterator_category(__i)又呼叫了內部函式__iterator_category(__i)。

template

inline

typename iterator_traits<_iter>::iterator_category

iterator_category(const _iter& __i)

__iterator_category(__i)中真正通過iterator_traits萃取出迭代器型別。

template

inline

typename iterator_traits<_iter>::iterator_category

__iterator_category(const _iter&)

SGI STL 迭代器實現

迭代器模式 該模式能夠提供一種方法,使之能夠依序尋訪某個聚合物 容器 所含的每個元素,而又無需暴露該聚合物的內部表達方式。stl原始碼剖析 它其實就是演算法與容器的一種粘膠劑。迭代器的行為非常類似智慧型指標 smartpointer 所以對他來說最重要的便是deference 內容提領 和membe...

sgi stl 特性萃取器

1 迭代器相關型別的萃取 iterator traits 許多演算法,如查詢,指標移動等都傳遞的是迭代器,而不同迭代器的型別決定了其演算法操作過程的差異 template struct iterator traits 針對原生指標型別,常量指標型別的的迭代器的萃取偏化版本,注意指標型別的迭代器是隨機...

迭代器和解析

for迴圈可以用於python中的任何序列型別,包括列表 元組以及字串。實際上,for迴圈甚至比這更為通用 可用於任何可迭代的物件。實際上,對python中所有會從左至右掃瞄物件的迭代工具而言都是如此,這些迭代工具包括了for迴圈 列表解析 in成員關係測試以及map內建函式等。檔案迭代器 已開啟的...