STL原始碼(2) 迭代器 trait

2021-10-08 09:14:57 字數 1608 閱讀 9868

const_iterator:不可通過迭代器改變所指的物件

一、iterator_traits:

演算法在使用iterator的時候需要知道迭代器指向物件的屬性,如果這裡的迭代器是乙個物件,則可以通過 ::直接獲取,但是如果迭代器是乙個指標,不能直接獲取。因此需要traits來獲取迭代器指向物件的屬性

二、_type_trait:

如果物件是乙個內建型別(int,double),或者物件的成員變數是內建型別,編譯器會自動呼叫析構函式,我們顯示呼叫析構函式會造成效率下降,因此對於無意義的析構函式的物件不需要呼叫析構函式。因此使用_type_trait來獲取物件的構造、析構等函式是否有意義,構造兩個物件來表示是否有意義。

struct _true_type

;//無意義的函式

struct _false_type

;//有意義的函式

對於乙個物件來說:

1)如果是內建型別或者c struct(只有成員沒有函式),ctor、dtor、assigmnet、copy都是trivial(無意義)

2)有任何一種函式的顯示宣告,是乙個繼承類,有非靜態成員指標並且使用了動態分配,即是non-trivial

template

<

typename t>

struct type_traits

;

因為內建型別和原生指標均為_true_type,因此出現了對內建型別和原生指標的偏特化版本

struct type_traits <

char

>

;

可能先根據用iterator_trait獲取迭代器指向物件的型別,再根據type_trait獲取物件的ctor、dtor是否有意義,沒有意義的話直接在記憶體操作,否則呼叫相關的函式。可以直接獲取變數的type_trait:

1)去除cv關鍵字:

就是為const,volite設計偏特化的版本,其他的為泛化的版本

2)進行查詢:

為所有的可能實現乙個偏特化繼承自true_type{},其餘的為泛化(false_type)

STL原始碼剖析學習三 迭代器與traits

stl的中心思想在於 將資料容器與演算法分開,彼此獨立設計,然後用膠合劑將他們撮合在一起。迭代器最重要的操作就是對operator 和operator 進行過載 為了不暴露容器的內部實現細節,每一種容器都有專屬的迭代器,這樣就可以把所有的實現細節封裝起來不被使用者看到。偏特化 如果模板類擁有乙個以上...

STL原始碼剖析 迭代器

一 迭代器 迭代器五種相應型別 1.valuetype,是指迭代器所指物件的型別。2.differencetype,用來表示迭代器之間的距離,可以用來表示乙個容器的最大容量。例如stl中的count 函式,其返回值就是difference type。3.referencetype,在c 中如果要傳回...

STL原始碼剖析 迭代器

迭代器是一種模式,實現了通過乙個統一介面訪問stl容器的方法。stl作為橋梁鏈結了stl演算法與容器。例如,我們可以通過sort a.begin a.end 完成一次利用演算法對vector型別容器a的排序。標準stl中,迭代器在容器內部,每種容器都有自己專屬的迭代器。這樣做的原因是,如果要建立迭代...