STL源码剖析
继续回顾
第二讲 认识c++标准库
1 oop vs GP
OOP:类中将data和methods放在一起
GP:data和methods分开
GP的优势如下:闭门造车
算法的本质
字符串默认的比大小就是首字母谁的位置靠后,绿色的strlonger是比较的方式。
2 源码之前需了解的基础
不是所有操作符都可以重载,例如::等
操作符重载可以写在类里,也可以写成全局函数
3 分配器 allocators
功能:动态空间配置、内存管理、内存释放
分配器的效率影响容器的效率
在xmemory头文件下
其中alloctor() 就是建立一个临时对象
调用allocate就是分配内存,实际是调用operator new(),而operator new()其实就是调用malloc()
调用deallocate就是释放内存,实际就是调用operator delete(),然后又在调用free
4 容器 结构性分类
5 深度探索list
- 由于list是双向链表,list每存储一个数据其实是用到了一个类指针_list_node,其中有两个指向前后的两个指针,和一个T类型的数据。
- 另外,除array、vector这些简单的容器的iterator可以++、–直接指向下一个数据,其他容器中的iterator基本都是类才可以设定这样的操作,因为list每个节点的内存都不是连续的,必须用到智能指针(itrator),也就是类指针去模拟正常指针的用法,故要大量用到操作符重载
一个容器的迭代器名字是类似_list_intrator。其中基本都有5个typedef,会有一大组的操作符重载
()的是前置++,(int)的是后置++,其中后置的还需要调用前置的。其中next是存储下一个节点prev地址,当++操作后,迭代器就移到了下一个节点
- 链表里的pushback,pushfront都是调用insert. popback、pop_front、remove都是调用erase。
- splice是链表接合操作,提供了很多公共接口,可以把某个值接过去,也可以把一段、另一个list接过去。底层都是调用的transfer,只是各个节点之间指针的操作变化。
- list不接受STL的排序算法,因为只支持随机迭代器,list只是双向迭代器
6 iterator所遵循的原则
iterator必须提供5种 associated types, 其中的(3),(4)从来没被用到过
iterator_category是看出这个迭代器的性质,是可以++ --还是可以跳着+,跳着-
value_type是指迭代器指的数据的类型
difference_type是两个迭代器之间的距离
算法和迭代器交互的方法是:算法提出问题,需要迭代器的什么属性,然后迭代器提供,便于算法进行操作数据
接上面的问题:当iterator不是类的时候,提供一个中间层去选择,即iterator_traits(迭代器萃取机)区分是类迭代器还是非类迭代器,用的接收变量的偏特化性质区分是哪个类
7 深度探索vector
其内部为:
新的len=2*old_size
由于vector是连续空间,故它的迭代器不是类,就是一个指针
看传入iterator_traits是什么,T*的话则iterator就是一个普通的指针(iterator=T *),传入 I 的话则iterator是一个类的指针,智能指针
复盘到vector,明日继续!!!gogo加油