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也得是智能的,因为空间不是连续的。
- 如果想重载运算符,就看整数是怎么弄的。