STL源码剖析(二)

opp(Object-Oriented Programming)vs GP(Generic Programming)

  • OPP:企图将datas和methods分开来
  • GP:企图将datas和methods分开来
  • 分开的好处:

(1)containers和algorithms可各自闭门造车,其间以Iterator为媒介。

(2)algorithms通过iterators确定操作范围,并通过iterator取用container元素。

  • 容器自己没有sort时才用全局的sort,有sort时,用自己的。如list。
  • 所有algoriothms,其内部最终涉及原属本身的操作,无非就是比大小。

操作符重载(需要学习)

  • Class Templates类模板(需要学习)

  • Function Templates函数模板(需要学习)

  • Member Templates成员模板(目前不需要)

Specialization 特化

//泛化
template<class type> struct _type_traits{...} 
_type_traits<Foo> a;
//特化1
template<> struct _type_traits<int> {...}
_type_traits<int> b;
//特化2
template<> struct _type_traits<double> {...}
_type_traits<double> c;

partial specialization 偏特化

//泛化
template<class T,class Alloc=alloc> class vector {...}
//偏特化
template<class Alloc > class vector<bool,Alloc> {...}

分配器allocator(这部分内容可以去看看内存管理)

  • oprearator new()会调用operator malloc(),malloc()会为元素分配很多额外空间。‘
  •  VC6、BC5 和GCC的STL的allocator()都只是以::opertator new和::operatoe delete完成allocate()和deallocate(),没有任何特殊设计。当元素很小,却很多时,额外开销的比例就会很大,这是这个设计的致命弱点。
  • G++SGI STL 2.9封装了allocator(),但是没有使用它,而是用了alloc()。它的目的时减少malloc的调用次数,减少额外开销(cookie,核心空间的上下都有)。每类容器里的元素类型是固定的。alloc()设计了16条链表,每条链表负责某一种特定大小的区块。
  • 在G4.9中,原来的alloc()成为了extention allocators中的_pool _allocto

容器结构与分类

容器list

  • 看代码技巧:看到不知道的type就往上看,因为它会把一些常用的type重命名。
  • list的实现有很多额外空间(每块用来指向前后的指针),程序员在使用容器时得知道这些特性。list的iterator也得是智能的,因为空间不是连续的。
  • 如果想重载运算符,就看整数是怎么弄的。
  •  

猜你喜欢

转载自blog.csdn.net/scqlovezy/article/details/82870007