STL原始碼剖析 移動advance

2021-08-29 02:21:43 字數 1740 閱讀 7481

目錄

一、 迭代器 

二、 型別萃取機 

2.1 處理類實現的迭代器

2.2 處理原生指標實現的迭代器

三、 advance 

3.1 iterator_category

3.2 啟用過載機制 

3.3 實現advance函式

#includetemplateclass iter

;

部分迭代器是用原生指標(pointer-to-const和pointer-to-non-const)實現的!

型別萃取機是與迭代器配套使用的。

templatestruct iterator_traits

;

部分迭代器使用原生指標(pointer-to-const和pointer-to-non-const)實現的,故而沒有類作用域,需要特殊處理: 

templatestruct iterator_traits//剔除指標型別

;templatestruct iterator_traits//剔除指標型別以及const修飾

;

根據移動特性和行為,迭代器被分為5類:

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;

下面羅列了四個同名過載函式,共同點就是都有三個引數且第三個引數都只宣告型別,並為指定引數名稱,因為它純粹是用來啟用過載機制,函式中根本不使用該引數(換句話說,如果要使用該引數,必須要有變數名)。如果硬要加上引數名稱也可以,畫蛇添足罷了。 

templateinline void __advance(inputiterator& i, distance n,			//前進

input_iterator_tag) //第三個引數是沒有引數名

templateinline void __advance(forwarditerator& i, distance n, //類似於有乙個介面,本質還是前進

forward_iterator_tag)

templateinline void __advance(bidirectionaliterator& i, distance n, //雙向

bidirectional_iterator_tag)

templateinline void __advance(randomaccessiterator& i, distance n,

random_access_iterator_tag)

值得注意的是,到底是何種迭代器在編譯期就能確定下來,而不用等到執行時,以提高效率。

templateinline void advance(inputiterator& i, distance n)

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

花了兩天時間略讀了一下 stl原始碼分析 看了個大體,對於細節並沒有深究。之所以想翻翻這本書,主要是想看看stl中的特性 介面卡的具體實現。看完之後收穫還是蠻大的,模板的各種組合讓我眼前一亮,下面大概總結一些內容。1.記憶體分配 sgi記憶體分配採用兩級實現,對於大記憶體塊的申請 大於128k 由第...