迭代器源码解析
迭代器的常用操作
對于我這種編程新人來說,知道怎么用比知道底層的源碼要更加重要一些,在絕大多數情況下當成指針用都沒有太大問題。
下面以vector為例
vector<int> iter; //聲明(有時候傳參的時候我習慣用auto) *iter //解引用,返回指向元素的引用 iter->val //解引用,獲取成員 iter++ //指向下一個元素 ++iter iter+n //指向前面iter1==iter2 //比較是否指向同一個元素 iter1-iter2 //計算兩個迭代器的距離也就是difference_type iter.begin() //頭迭代器 iter.end() //尾迭代器結合源碼新的理解
之前理解的迭代器就是算法操控容器的工具,也可以理解成指針。侯捷老師給了一個新的解釋,算法向迭代器提五個關于容器的問題,迭代器進行回答,這就是迭代器的作用。下面通過源碼再來看看。
//提問 template<typename I> inline void algorithm(I first,I last) {I::iterator_categoryI::pointerI::referenceI::value_typeI::difference_type }; //回答 template<class T,class Ref,class Ptr> struct __list_iterator {typedef bidirectional_iterator_tag iterator_categorytypedef T value_type;typedef Ptr pointer;typedef Ref reference;typedef ptrdiff_t difference_type }Traits
這樣的設計方式有一個小問題,如果iterator并不是一個class呢,也就是說是一個普通的指針,編譯器又如何識別之間的區別呢?Iterator Traits完成了這項工作。所以算法不能直接問,而是間接問,先問traits,讓后者先去識別是class iterator還是non-class iterator。
template<typename I,...> void algorithm(){typename iterator_traits<I>::value_type v; } template <class I> struct iterator_traits{typedef typename I::value_type value_type; } template <class T> struct iterator_traits<T*>{typedef T value_type; } template <class T> struct iterator_traits<const T*>{typedef T value_type;//注意這里依然是T因為聲明無法被賦值的變量是沒有意義的 }總結
- 上一篇: union一个有趣的应用
- 下一篇: 实习第二弹——交换机的配置与统计