迭代器是一種行為類似指針的對象,而指針的各種行為中最常見的便是解引用(*)和成員訪問(->),此外還有operator++。因此,迭代器最重要的編程工作是對operator*和operator->進行重載工作。關于這部分的代碼,可以參考class auto_ptr。
迭代器一般會和某種容器相關聯,指向某種類型的元素,這種元素的類型(value_type)叫做相應類型。常用的相應類型有五種:
value_type:迭代器所指對象的類型。
difference_type:兩個迭代器之間的距離。
reference:容器內元素的引用。
pointer:容器內元素的指針。
iterator_category:表示迭代器類型,根據迭代器類型激活重載函數。關于這一點,可以參考STL算法advance()。
如果某個函數的返回類型為迭代器的相應類型,那么靠“模板實參推斷”是無法實現的,而“特性萃取”技術能夠很好的解決這個問題。
為了獲得迭代器的相應類型,STL采用了一種稱為特性萃取的技術,能夠獲得迭代器(包括原生指針)的相應類型:
~~~
template <class Iterator>
struct iterator_traits {
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
};
~~~
針對原生指針的特化版本:
~~~
template <class T>
struct iterator_traits<T*> { // 特化版本,接受一個T類型指針
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
};
template <class T>
struct iterator_traits<const T*> { // 特化版本,接受一個T類型const指針
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
};
~~~
當然,為了符合STL規范,用戶自定義的迭代器必須添加這些相應類型,特性萃取機才能有效運作。
參考:
《STL源碼剖析》 P80、P85.
- 前言
- 順序容器 — heap
- 關聯容器 — 紅黑樹
- 關聯容器 — set
- 關聯容器 — map
- 關聯容器 — hashtable
- 關聯容器 — hash_set
- 關聯容器 — hash_map
- 算法 — copy
- 順序容器 — stack
- 順序容器 — queue
- 順序容器 — priority_queue
- 順序容器 — slist
- construct()和destroy()
- 空間配置器
- 函數適配器
- 迭代器以及“特性萃取機”iterator_traits
- 算法 — partial_sort
- 算法 — sort
- 仿函數
- 適配器(adapters)
- C++簡易vector
- C++簡易list
- STL算法實現
- C++模板Queue