迭代器模式:提供一種方法,使之能夠依序訪問某個容器中的各個元素,而又無需暴露該容器的內部表述方式。
迭代器是容器和演算法之間的膠合劑。
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...