STL原始碼剖析筆記 第三章

2021-09-25 06:18:43 字數 2684 閱讀 8224

迭代器型別之一:value type

1.1 宣告內嵌型別

template<

class

t>

struct myiter t

& operator*()

const

//...

} template<

class

i>

typename i

::value_type //是func的返回值型別

func

(i ite)

//...

mtiter

ite(

newint(8

)); cout<<

func

(ite)

;//輸出:8

func的返回型別必須加上typename,因為t是乙個template引數,在它被編譯器具現化之前,編譯器對t一無所悉,換句話說,編譯器此時並不知道myiter< t >::value_type代表的是乙個型別或是乙個member function 或是乙個data member。但是並不是所有的迭代器都是class type,原生指標就不是,所以還需要偏特化來處理。

注:用 typename 去標識 nested dependent type names(巢狀依賴型別名),在 base class lists(基類列表)中或在乙個 member initialization list(成員初始化列表)中作為乙個 base class identifier(基類識別符號)時除外。

1.2 偏特化

template>

classc;

//這個泛化版本允許接受t為任何型別

template>

class

c>

;//這個特化版本僅適用於t為原生指標的情況

1.3 traits

template<

class

i>

struct iterator_traits

這個所謂traits的意義是如果i定義有自己的value type,那麼通過這個traits的作用,萃取出來的value_type就是i::value_type。換句話說,如果i定義有自己的value type,先前的func()可以改寫成這樣:

template<

class

i>

typename iterator_traits<

i>

::value_type //是func的返回值型別

func

(i ite)

traits可以有特化版本:

template<

class

t>

struct iterator_traits>

template<

class

t>

struct iterator_traits<

constt*

>

1.4 最常用到的迭代器相應型別有五種:value type,difference type,pointer,reference,iterator catagoly。如果自己開發的容器想要與stl融合,需要為容器定義這五種相應的型別。

template<

class

t>

struct iterator_traits>

iterator_traits針對傳入型別是pointer及pointer-to-const設計特化版本

迭代器型別之一:difference type

2.1 difference type用來表示兩個迭代器之間的距離。

2.2 任何時候當我們需要任何迭代器i的difference type,可以這麼寫:

typename iterator_traits::difference_type

迭代器型別之一:reference type

迭代器型別之一:pointer type

迭代器型別之一:iterator_catagoly

5.1 input iterator:唯讀

5.2 output iterator:唯寫

5.3 forward iterator:寫入型,單向移動

5.4 bidirectional iterator:雙向移動

5.5 random access iterator:前四種只有一部分指標算術能力,前三種支援operator ++,第四種再加上operator --,第五種則涵蓋所有指標算術能力,包括p+n,p-n,p[n],p1-p2,p1<

class

forwarditerator

,class

distance

>

inline void

_advance

(forwarditerator& i,distance n, forward_iterator_tag)

5.8 __type_traits,允許針對不同的型別屬性,在編譯時期完成函式派送決定,其結果不應該只是個bool值,應該是個有著真假性質的物件,因為我們希望利用其響應結果來進行引數推導,而編譯器只有面對class object形式的引數才會做引數推到。

《STL原始碼剖析》第三章筆記

stl原始碼剖析 p88 iterator traits const int value type 常量指標 const pointer 常量指標必須初始化,而且一旦初始化完成,則它的值 也就是存放在指標中的那個位址 就不能再改變了。想要弄清楚這些宣告的含義最行之有效的方法是從右向左閱讀。在上述例子...

第三章 LinkedList原始碼分析

linkedlist底層是乙個雙向鍊錶,是乙個直線型的鍊錶結構 在jdk1.7以前,其底層是雙向迴圈鍊錶 1.建立 鍊錶中的所儲存的元素個數 transient int size 0 指向頭結點的指標 transient nodefirst 指向尾結點的指標 transient nodelast 無...

第三章筆記

第三章預習筆記 一 高階語言和機器指令中的運算 1,按位運算 符號 按位or運算 符號 按位and運算 符號 表示按位not運算 符號 按位xor運算。實現掩碼操作 通過與給定的乙個位模式進行按位與,可以提取所需要的位,對這些位進行 置1 清0 等。2,符號 按位or運算 符號 表示and運算 符號...