STL原始碼剖析 迭代器

2021-09-29 07:14:51 字數 3201 閱讀 4181

迭代器是一種模式,實現了通過乙個統一介面訪問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,這樣就可以借用迭代器去訪問容器了。迭代器並不屬...