STL學習筆記 迭代器以及Traits技術

2021-08-07 07:09:52 字數 2750 閱讀 1102

迭代器模式:提供一種方法,使之能夠依序訪問某個容器中的各個元素,而又無需暴露該容器的內部表述方式。

迭代器是容器和演算法之間的膠合劑。

1.如何判斷迭代器的型別

1)通過編譯器對函式模版的實參推倒可以解決引數類別的判定,如下

templatevoid func_imp1(i iter, t t)

templateinline void func(i iter)

int main()

2)通過內嵌型別宣告解決返回值型別的判定,如下

templatestruct myiter//迭代器類

t& operator*()

//.....

};templatetypename i::value_type func(i iter)//演算法類 !!typename i::value_type為返回值的型別宣告

3)通過traits解決原生指標的返回型別問題

*不同的容器有不同的專屬迭代器,而不同的迭代器具有不同的特性;但是演算法的介面確實統一的,

演算法通過traits技術獲取不同的迭代器屬性,然後選擇正確的流程;

traits依靠顯式模版特殊化把**中因型別不同而發生變化的片段提取出來,用統一的介面來包裝;

traits允許系統在編譯的時候根據型別做一些判斷,遵循另增乙個間接層的宗旨。

例如:

//泛化版本

template//i為迭代器類,迭代器類要內嵌型別宣告

struct iterator_traits//相當於乙個中間層

; //特化版本1

templatestruct iterator_traits//迭代器是個原生指標

//特化版本2

templatestruct iterator_traits< const i*>//迭代器是個原生指標

//2)的修改版本

templatetypename iterator_traits::value_type func(i iter)//通過iterator_traits類實現介面統一

2.迭代器內嵌相應型別

1)value_type:表示迭代器所指物件的型別

2)difference_type:表示兩個迭代器之間的距離

3)reference:傳遞迭代器所指物件的引用

4)pointer:傳遞迭代器所指物件的位址

5)iterator_category(迭代器種類):

a.input iterator:唯讀,支援p++

b.output iterator:只寫,支援p++

c.forward iterator:允許寫入型演算法在此種迭代器所形成的區間上進行讀寫操作,支援p++

d.bidirectionl iterator:可雙向移動,支援p++,p--

e.random access iterator:支援p++,p--,p[n],p+n,p-n,p1-p2,p1           *任何乙個迭代器,其型別永遠應該落在「該迭代器所隸屬的各種型別中,最強化的那個」;

*stl演算法的乙個命名規則:以演算法所能接收的最低階迭代器型別,來為其迭代器型別引數命名;template

*迭代器型別之間存在繼承關係 inputiterator<-forwarditerator<-bidirectionl iterator<-random access iterator

注意:任何迭代器都應該提供五個內嵌相應型別,以利於traits萃取型別。繼承stl提供的iterator類可以滿足這個要求。

3.stl迭代器關鍵宣告**

1)//五種迭代器型別(只是用來區分型別,方便實現函式過載)

struct input_iterator_tag{};

struct output_iterator_tag{};

struct forward_iterator_tag : public input_iterator_tag {};

struct bidirectionl_iterator_tag : public forward_iterator_tag {};

struct random_access_iterator_tag : public bidirectionl_iterator_tag {};

2)//iterator類,供客戶自定義的迭代器類繼承

templatestruct iterator

3)//iterator_traits類,用來判定型別

//泛化版本

templatestruct iterator_traits

//特化版本,針對原生指標t*

templatestruct iterator_traits

4.++、--

iterator<>& operator ++();//表示前置,++it;

iterator<>& operator ++(int);//表示後置,it++;

STL學習筆記14 迭代器

所有的容器都定義了自己的迭代器型別,所以一般情況下,不需要再自己新增迭代器標頭檔案。但是如果要使用一些特殊的迭代器,如反向迭代器,或者一些迭代器輔助函式,那麼就需要新增標頭檔案。型別能力 提供者輸入迭代器 一次向前讀取 istream 輸出迭代器 向前寫入 ostream,inserter 前向迭代...

STL 迭代器學習

stl中迭代器是連線演算法和容器的工具,迭代器可以在不了解容器內部原理的情況下遍歷容器。迭代器要遍歷容器的元素,所以它內部必須封裝乙個與容器型別相關聯的指標,通過過載 等操作符實現迭代器操作。迭代器是乙個類模板,主要包括乙個指標,可以包含各種型別的元素,根據容器的不同,等操作實現也會不同。迭代器的5...

STL學習筆記(迭代器配接器)

reverse 逆向 迭代器 reverse迭代器是一種配接器。重新定義遞增運算和遞減運算。使其行為正好倒置。如果你使用這類迭代器,演算法將以逆向次序處理元素。所有標準容器都允許使用reverse迭代器來遍歷元素。下面是個例子 1 include 2 include 3 include 4 usin...