天天看點

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

歡迎加入我們的QQ群,無論你是否工作,學生,隻要有c / vc / c++ 程式設計經驗,就來吧!158427611 

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

STL源碼學習之疊代器iterator 

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

【2】SGI STL疊代器iterator

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

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

STL的疊代器使用一種Traits程式設計技巧,來實作疊代器對容器資料的識别,操作,等...

因而有五種疊代器内部辨別,來實作疊代器功能。STL的标準疊代器内部都需要有這五種辨別。

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

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

value_type // 表示疊代器指向内容的 類型 ;

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

pointer //指針操作 *

reference //取址操作 &

STL中,想自己實作疊代器,就需要定義以上五種辨別。

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

【如deque的疊代器就是沒有繼承STL的iterator ,而自己定義實作的五種辨別。】

STL的iterator 代碼如下:

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

可以看到, diffrence_type,pointer,reference都是有預設值的。

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

關于iterator_category的五種類型【隻讀,隻寫,可讀寫,可雙向,可随機】

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

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

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

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

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

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

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

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

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

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

【随機讀取疊代器可以直接相減就計算出距離(如連續記憶體内的指針),另外的疊代器則隻能通過周遊,擷取距離(如連結清單的指針)】

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

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

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

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

歡迎加入我們的QQ群,無論你是否工作,學生,隻要有c / vc / c++ 程式設計經驗,就來吧!158427611 

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

繼續閱讀