迭代器是一種模式,實現了通過乙個統一介面訪問stl容器的方法。stl作為橋梁鏈結了stl演算法與容器。例如,我們可以通過sort(a.begin() , a.end())完成一次利用演算法對vector型別容器a的排序。
標準stl中,迭代器在容器內部,每種容器都有自己專屬的迭代器。這樣做的原因是,如果要建立迭代器,就必須訪問容器的內部結構,所以直接封裝進容器內部是最簡單的方式。
迭代器的設計過程中需要獲得迭代器指向的資料型別,有效的一種方式是通過traits來提取value type,對於原生指標,可以提取出指標指向的value type。如:
template
struct test
>
通過實現多個不同的template 特化版本,就能實現多種資料型別的型別提取
input iterator 唯讀
output iterator 只寫
forward iterator 允許區間操作
bidlrectional iterator 雙向移動
random access iterator 支援隨機訪問
value type : 內部值的型別
difference type : 表示迭代器之間的距離
reference type : 內部資料的引用型別。代表著iter指向的內容是否是const的,如果不是const那麼解引用應該返回引用(左值)而不是值(右值)
pointer type : 內部資料的指標型別
iterator_category : iterator的型別。需要根據不同型別做出不同響應
stl提供了乙個iterator基類,自己實現的iterator只要繼承此類就能夠保證實現了五個型別
template
<
class
t>
struct iterator_traits
>
;//針對pointer-to-const而設計的traits偏特化版本
template
<
class
t>
struct iterator_traits<
const t*
>
;
//五種迭代器,作為tag供過載使用
struct input_iterator_tag
;struct output_iteratoe_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
;
從模板中獲得當前iterator屬於哪個型別,獲得型別後根據同一介面呼叫不同函式:
/*函式過載,使迭代器能在編譯時期就確定呼叫哪個函式*/
template
<
class
_inputiter
,class
_distance
>
/*迭代器型別為input_iterator_tag的函式定義*/
inline
void
__advance
(_inputiter& __i, _distance __n, input_iterator_tag)
template
<
class
_bidirectionaliterator
,class
_distance
>
/*迭代器型別為bidirectional_iterator_tag的函式定義*/
inline
void
__advance
(_bidirectionaliterator& __i, _distance __n,
bidirectional_iterator_tag)
template
<
class
_randomaccessiterator
,class
_distance
>
/*迭代器型別為random_access_iterator_tag的函式定義*/
inline
void
__advance
(_randomaccessiterator& __i, _distance __n,
random_access_iterator_tag)
template
<
class
_inputiterator
,class
_distance
>
/*決定呼叫哪個函式,這是乙個對外介面*/
inline
void
advance
(_inputiterator& __i, _distance __n)
iterator_traits負責萃取迭代器的特性,__type_traits負責萃取型別(type)的特性
是否具備non-trivial default ctor?
是否具備non-trivial copy ctor?
是否具備non-trivial assignment operator?
是否具備non-trivial dtor?
是否為pod(plain old data)型別?
通過指定型別,在編譯期間決定以上特性 ,來避免額外呼叫(如construct , destruct等),提高效率
struct _true_type
;struct _false_type;/*
*非基本資料型別,預設指定為_false_type只能自己初始化,不能系統進行
*/template
<
class
t>
struct _type_traits
;
STL原始碼剖析 迭代器
一 迭代器 迭代器五種相應型別 1.valuetype,是指迭代器所指物件的型別。2.differencetype,用來表示迭代器之間的距離,可以用來表示乙個容器的最大容量。例如stl中的count 函式,其返回值就是difference type。3.referencetype,在c 中如果要傳回...
stl原始碼剖析01 迭代器
下面介紹乙個容器 演算法 迭代器在一起使用的案例 templateinputiterator find inputiterator first,inputiterator last,const t value include include include include include using...
重讀STL原始碼剖析 迭代器
首先關於迭代器 迭代器不屬於容器,它與容器屬於不同的類,但通過迭代器 迭代器中有某些成員變數 同時也對 等運算子進行了過載 可以訪問到容器內的元素 比如list的迭代器,它不屬於list,但它裡面存放了乙個指標,這個指標指向list結構裡的成員node,這樣就可以借用迭代器去訪問容器了。迭代器並不屬...