traits程式設計思想

2021-05-24 12:30:13 字數 1057 閱讀 5740

首先引用書上的一句話: stl中心思想是把資料容器和演算法分開。

迭代器是兩者結合的關鍵,那麼我們演算法當然是通過迭代器來對容器操作了,但是我們在演算法中經常需要得到迭代器的相應型別:比如 迭代器說指向的型別。那麼怎麼得到這些型別呢,當然你可以通過函式模板實現部分功能,也可以通過在迭代器裡自定義這些型別。比如:

template<...........>

struct iterator

typedef t   value_type;

通過這種方式來直接得到型別,但是如果我們在給某個演算法函式提供的是 指標而不是迭代器怎麼辦呢,指標不是class 我們當然不能在裡面定義這些類別。

這個時候就有了 traits思想了,我們可以通過乙個類模板,得到無論是指標還是迭代器的相應型別:

template

struct iterator_traits

typedef  t::value_type value_type;

然後利用模板偏特例化:

template

struct iterator_traits

typedef t   value_type;

這樣就可以 統一的抽取出 相應型別了,而不用在乎到底是指標的還是迭代器的。

**如下:

最後來看:

typedef typename t::iterator_category   iterator_category;

這一句**。

這句**是提供獲得 迭代器的型別,迭代器型別分為5類:

input iterator

output iterator

forward iterator

bidirectional iterator

random access iterator

之所以要提供識別迭代器型別,是因為不同的迭代器型別對應了不同的元素訪問方式,那麼也對應著演算法的效率。

如果你不提供這些型別,那麼你只有通過 ++  --來依次訪問元素了,這個對於像指標這種隨機訪問的是不公平的,因為指標可以直接+n,如果你一次一次的+1這樣操作肯定效率是會很低的,所以這裡就有必要提供迭代器的型別。

traits程式設計技法

iterator模式定義如下 提供一種方法,是指能夠依次序尋訪某個聚合物 容器 所含的各個元素,而又無需暴露該聚合物的內部表達。迭代器是一種智慧型指標 迭代器最重要的程式設計工作就是對opertor 和operator 進行過載工作。在演算法中運用迭代器時,很可能會用到其相應型別。利用functio...

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...