STL源碼學習之迭代器iterator 【2013.11.15】

歡迎加入我們的QQ羣,無論你是否工作,學生,只要有c / vc / c++ 編程經驗,就來吧!158427611 【IT】C/C++/STL/Linux/W

STL源碼學習之迭代器iterator 

學習來源《STL 源碼剖析》 侯捷譯


【2】SGI STL迭代器iterator

迭代器在STL中的低位是很重要的,可以說有了,STL容器纔有存在的意義。一個東西存在的意義在於,讓別人能夠使用,能夠操作,迭代器之於容器,就是這樣的 關係;有了迭代器,我們才能使用容器,才能操作容器!

若把你的學識比作容器,那迭代器就是你的口眼手腳,其他人想了解你,只有通過你的口眼手腳來了解,來影響。從而得到你的學識。認識你。重用你!(不大嚴謹的比喻)


STL的迭代器使用一種Traits編程技巧,來實現迭代器對容器數據的識別,操作,等...

因而有五種迭代器內部標識,來實現迭代器功能。STL的標準迭代器內部都需要有這五種標識。


iterator_category//表示 迭代器的種類,有什麼樣的功能 { 只寫,只讀,讀寫,雙向可操作,隨機可操作。五種};

value_type // 表示迭代器指向內容的 類型 ;

difference_type//表示兩個迭代器之間的距離 ;

pointer //指針操作 *

reference //取址操作 &

STL中,想自己實現迭代器,就需要定義以上五種標識。

STL定義了一個 iterator 內部定義(單單是定義)了以上五種標識,定義自己的迭代器的時候可以繼承iterator 就可以,如果不想的話,就需要自己定義了。

【如deque的迭代器就是沒有繼承STL的iterator ,而自己定義實現的五種標識。】

STL的iterator 代碼如下:


可以看到, diffrence_type,pointer,reference都是有默認值的。

【ptrdiff_t是c/c++標準庫中定義的與機器相關的數據類型,保存的是兩個指針相減的結果,這樣就能表示兩個迭代器之間的距離了。】


關於iterator_category的五種類型【只讀,只寫,可讀寫,可雙向,可隨機】

而且迭代器的類型是根據設計容器的人,對迭代器的要求而決定的,所以迭代器是在容器設計之初就確定了的,而不是通過編譯期代碼確定的!

STL 中是這樣定義五種類型的,其中有繼承關係,一層比一層擴展。

STL,在決定使用那種迭代器類型的時候,由傳入的迭代器類型來決定迭代器類型,很簡單,看代碼:


這是iterator_category的構造方法,由傳入的Iterator返回對應的iterator_category類型 category。

確定迭代器距離類型,就是一個static_cast<>類型轉換 。【根據類型計算距離 】

計算距離。distance爲暴露接口,內部調用重載方法__distance,根據category()的不同。調用不同重載方法計算,

【隨機讀取迭代器可以直接相減就計算出距離(如連續內存內的指針),另外的迭代器則只能通過遍歷,獲取距離(如鏈表的指針)】

其實也是強制轉換...和判斷迭代器類型一樣

advance(迭代器的前進或者後退)爲暴露的外部方法,內部由重載的__advance方法實現。和__distance的重載方式一樣。是根據iterator_category()來判斷迭代器內部類型。是寫的 還是 雙向 還是隨機的。



歡迎加入我們的QQ羣,無論你是否工作,學生,只要有c / vc / c++ 編程經驗,就來吧!158427611 【IT】C/C++/STL/Linux/W

發佈了74 篇原創文章 · 獲贊 5 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章