整理至侯捷《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內建函式等。檔案迭代器 已開啟的...