traits程式設計技法

2021-08-21 23:39:14 字數 2772 閱讀 2072

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 當我們使...