iterator模式定義如下:提供一種方法,是指能夠依次序尋訪某個聚合物(容器)所含的各個元素,而又無需暴露該聚合物的內部表達。
迭代器是一種智慧型指標
迭代器最重要的程式設計工作就是對opertor*和operator->進行過載工作。在演算法中運用迭代器時,很可能會用到其相應型別。利用function template的引數推導機制,宣告乙個變數,以「迭代器所指物件的型別」為型別。
迭代器相應型別不只是「迭代器所指物件的型別」一種而已。最常用的相應型別有五種,然而並非任何情況下任何一種都可利用上述template引數推導機制來取得。
traits程式設計技法——stl源**門鑰
函式的「template引數推導機制」推而導之的只是引數,無法推倒函式的返回值。宣告內嵌型別可以推倒函式的返回值。例如:
template < class t>
struct myiter
};template < class i>
typename i::value_type func(i ite)
myiter< int> ite(new int(8));
cout << func(site);
然而,並不是所有迭代都是class type,如果不是class type就無法為它定義內嵌型別,比如原聲指標就不是class type,需要做特殊處理,使用template partial specialization可以做到。
partial specailization(偏特化)的意義
partial specialization的意義:「所謂partial specialization的意思是提供另乙份template定義,而其本身扔為templatized」。
template< typename t>
class c;//這個泛化版本允許(接受)t為任何型別
類c的偏特化版本:
template< typename t>
class c< t* > ;//這個特化版本僅適用於「t為原聲指標」的情況
「萃取」迭代器的特性,而value type正是迭代器的特性之一:
template< class i>
struct iterator_traits;
traits的意義是:如果i定義有自己的value type,那麼通過這個traits的作用,萃取出來的value type就是i::value_type。這帶來的好處是traits可以擁有特化版本。
最常用到的迭代器相應型別有五種:value_type, difference_type, pointer, reference, iterator category.
迭代器相應型別之一:value type
value type是指迭代器所指物件的型別,任何乙個打算與stl演算法搭配的class,都應該定義自己的value type內嵌型別
迭代器相應型別之二:difference type
difference type用來表示兩個迭代器之間的距離,因此它也可以用來表示乙個容器的最大容量,因為對於連續空間的容器而言,頭尾之間的距離就是其最大容量。
例如stl的count(),其傳回值就必須使用迭代器的difference type:
template < class i, class t>
typename iterator_traits< i >::difference_type
count(i first, t last, const t& value)
return n;
}迭代器相應型別之三:reference type
從「迭代器所指之物的內容是否允許改變」可以將迭代器分為兩種:
1.constant iterators:不允許改變「所指物件之內容」
2.mutable iterators:允許改變「所指物件之內容」
當我們對乙個mutable iterators 進行提領操作時,獲得的應該是乙個左值,因為右值不允許賦值操作,左值允許。
在c++中, 函式如果要傳回左值,都是以by reference的方式進行。
迭代器相應型別之四:pointer type
pointers和references在c++中有非常密切的關聯。如果「傳回乙個左值,令它代表p所指之物」是可能的,那麼「傳回乙個左值,令它代表p所指之物的位址」也一定是可以的。也就是說,我們能夠傳回乙個pointer,指向迭代器所指之物。
迭代器相應型別之五:iterator_category
根據移動特性與施行操作,迭代器被分為五類:
input iterator:這種迭代器所指的物件不允許外界改變,唯讀
output iterator:只寫
forward iterator:允許「寫入型」演算法在此種迭代器所形成的區間上進行讀 寫操作
bidirectional iterator:可雙向移動,某些演算法需要逆向走訪某個迭代器區間,可以使用bidirectional iterators.
random access iterator:前四種迭代器都只**一部分指標算數能力(前三種支援operator++, 第四種再加上operator–,第五種涵蓋所有指標算數能力,包括p+n, p-n, p[n],p1-p2, p1
Traits程式設計技法
照順序,這次應該是迭代器iterator的內容了,然而iterator涉及到乙個重要的技巧就是traits程式設計技法。在使用iterator時,可能需要知道它的相應型別,也就是iterator指向的變數的型別,在c c 語言中,如果要獲取乙個變數的大小可以使用sizeof 操作符。然而如果想要獲取...
STL之traits程式設計技法
traits程式設計技法利用了 內嵌型別 的程式設計技巧與編譯器的template引數推導功能。下面主要看看利用traits程式設計技法實現的迭代器萃取機制。5種迭代器型別定義 struct input iterator tag struct output iterator tag struct f...
STL中,traits程式設計技法 模板
stl中,traits程式設計技法得到了很大的應用,了解這個,才能一窺stl奧妙所在。先將自己所理解的記錄如下 traits技術可以用來獲得乙個 型別 的相關資訊的。首先假如有以下乙個泛型的迭代器類,其中型別引數 t 為迭代器所指向的型別 template class myiterator 當我們使...