课上版本GNU2.91
OOP面向对象编程与GP泛型编程
OOP:数据和操作放在一起
GP:将数据和操作分开来
如果容器自带sort则用容器自带的
算法涉及元素本身的操作就是比大小
相当于是重新定义了一个操作将之替换为=原来默认的<
技术基础:操作符重载and模板(泛化 全特化 偏特化)
不可重载的操作符
_list_iterater
类模板(定义类)
函数模板(定义函数)
注:template
成员模板
特化specialization
template
struct __type_traits{}
template<> struct __type_traits
partial Specialization
个数上的偏————有两个模板参数 绑定其中一个
范围上的偏————
分配器allocators(不建议使用)
operator new() 和 malloc()
VC6所附的标准库,其allocator实现如下()
int*p = allocator
allocator
BC5对allocator的使用(容器使用分配器)
所有容器第二个模板参数都是class Allocator = allocator
BC5所附的标准库,其allocator实现如下
注:用法和vc一样 但vc没有默认值----BC---int*p = allocator().allocate(512);//分配
G2.9所附的标准库,其allocator实现如下
注:若果区块大 则开销所占比例小,而现实中通常区块小
G4.9所附的标准库,其allocator实现如下
operate new 调用 malloc
operate delete 调用free
4.9中的__pool_alloc就是2.9中的alloc
容器 -- 结构与分类
g2.9几乎没有继承
注:slist名为forward_list,hash_set名为unordered_set
容器 list(2.9--4 vs 4.9--8)
所有的容器除了vector之外和array之外都必须是class
list的iterator设计
所有的容器都要有typedef 必须是iterator
type++的设计 :1.记录原址self tmp = *this; (不会唤起operator*,其实是唤起copy ctor用以创建tmp并以*this 为初值 不会唤起ope 因为*this已被解释为ctor的参数) 2.进行操作 ++*this; 3.返回原址return tmp;
注:c++不允许后++两次 故itrator前++写成self& operator++() {node = (link_type)...... (前++没有&)
Iterator设计原则和 iterator traits的作用和设计
iterator traits——用于萃取iterator特性,那算法如何获知迭代器的属性呢?这一任务就是traits完成的。在STL实现中,traits编程技术得到大量的运用,它利用了“内嵌类型”的编程技巧与C++的template参数推导功能,弥补了C++类型识别方面的不足。通过traits,算法可以原汁原味的将迭代器的属性萃取出来,帮助算法正确高效的运行。
Iterator需要遵循的原则
Iterator需要回答Algorithms的五种问题
1.iterator_category 2.difference_type 3.value_type 4.reference 5.pointer(4 5没有用过)
1.iterator_traits——用以分离class iterators 和non-iterator