《STL源碼剖析》學習備忘

 目錄:
皰丁解牛(侯捷自序)
目錄
前言
第1章 STL概論與版本簡介
第2章 空間配置器(allocator)
第3章 迭代器(iterators)概念與traits編程技法
第4章 序列式容器(sequence containers)
第5章 關聯式容器(associattive containers)
第6章 算法(algorithms)
第7章 仿函數(functors,另名 函數對象function objects)
第8章 配接器(adapters)
附錄A 參考書籍與推薦讀物
附錄B 候捷網站(本書支持站點簡介)
附錄C STLPort 的移植經驗(by孟巖)
索引

【3 Iterator traits】

  1. 算法要泛化,iter要有相同動作。但其實現細節不可避免地因容器而異。所以容器負責提供iter。不同容器需要不同iter類型。
  2. 算法要根據不同容器、不同元素因地制宜提高效率。iter類型代表容器,*iter代表元素。算法內部不可避免要用到iter所指元素的類型(如,提供臨時變量)。
  3. C++沒有typeof(),編碼時無法指定iter所指元素的相關型別如int,int *,const int&。
  4. 函數模板的參數推導機制可行:<T>f(T iter){g(iter,*iter)} ,<T1,T2>g(T1 iter,T2 t) 途徑T-iter--*iter-T2 ,不能推導返回參數
  5. 類模板聲明內嵌型別可行:<T1>iter{T1--type} <T> T::type func(T iter ) ,但對指針型iter,無法指定type。
  6. 模板偏特化機制可行:加iterators_traits可以爲指針提供特化版本,其他就多一層。這樣同一建立內部型別,更完善(代碼簡潔)。
  7. 但是,如果iterators_traits<const int*>::value_type將得到cont int,而我只想要int!再來個偏特化。
  8. value、diffrence、ref、pointer、iter_cate
  9. 算法需要知道iter之類。分支判斷可行(執行期決定)。應該編譯期確定。
  10. 每個iter都要指明相關型別(typedef ),自制選itertor模板;iterators_traits從T獲知相關類型。每個算法都要知道iter種類,並由此調用相關子函數。關鍵:用class做標籤。
  11. 例子:advance(iter,n)-->參數推導出T-->typedef trait::cate tag()-->調用 _advance(iter,n,tag())-->無名對象也是對象-->實參推導出類型-->函數重載出函數。
  12. 所謂STL,就是利用編譯器的推理完成確定的事情,如求和1~100。這樣編譯時間長,代碼簡潔優化。多用inline,const,&

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章