《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,&

 

 

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