首先引用書上的一句話: 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...