STL源码剖析总结——使用c++标准库
前段时间学习了STL,今日开始复盘,整理下汇总,图片均引自侯捷STL源码剖析
GP(Generic Programming)泛型编程最成功的就是STL(Standard Template Library),以头文件形式呈现,所有的头文件都在std标准命名空间内
为了代码的复用性,建立数据结构和算法的一套标准,以泛型编程思维建立各个抽象概念(迭代器、容器),并加以系统化
SGI STL:
<stl_config.h>为让STL具备广泛移植能力,设置了一个环境组态文件,预设了许多常量
第一讲 使用c++标准库
1 概念
分配器给容器分配内存,我们就只需要像容器添加数据就好了
迭代器像一个泛化的指针
分配器不写就默认有一个
仿函数、容器、迭代器中都可能有适配器的使用
认识一下使用容器的复杂度,前提条件N要很大,几十万工业级的这种标准
2 结构性分类(各容器内存怎么使用的)
序列式容器:数据放进去是什么顺序就是什么顺序,遍历快
关联式容器:放进去进行排序,这种容器便于查找
红框是c++11新加入的
unorderd container未定序容器,其实就是关联式容器的一种,是由hashtable组成的
List是双向链表
forward-list是单向链表
3 array
ASIZE是容器的大小,有默认值50w
target是自己输入要查找的目标值
clock()是获取程序执行到当前行所用的时间 clock()-timestart就可以获取到具体几行之间执行的时间
array.data()是获取数组的首地址
qsort是排序,二分查找前必须要排序
4 vector
尽管push.back()是一个一个的放数据,但vector适配器扩充内存是两倍两倍的扩充,每一次扩充都要找一块新的连续内存,然后把之前的数据移动多来
try catch 是用来抓取异常的发生,防止内存溢出
snprintf:将可变参数按照规定格式化成字符串,然后放到规定的字符数组中,图中是把10个rand()的随机数格式化成整型数(%d)放到buf中
比较find()和先排序在二分查找的时间快慢,最后结论是,二分查找不一定快
5 list
多了一个max.size(),即能存放的最多的数据大小
c++有全局标准库有sort(),一些容器内部也有自己的sort()
在这里插入图片描述
6 fordward_list
没有push.back,只有push。front
和slist一样用法
7 deque
每次扩充是一个buff(缓冲区),随机访问的迭代器。不提供函数可以得到迭代器,因为我们不能改变中间的值,即我们没办法用全局函数find()
8 stack queue 堆 栈
它其实就是deque的简化版本,可当作一个适配器
stack:先进后出
queue:先进先出
不提供iterator,因为一但提供就会改变先进后出这样的规则
9 multiset/set
multiset:可重复数据
无push.back,是在特定位置insert
安插慢,但是查找很快,用的红黑树数据结构
10 multimap/map
是有key得,即pair<int,string>
11 unordered_multiset/unorderd_multimap/set/map
用哈希表做数据结构的
也是用insert
篮子里面有链表,每个链表里的数据不确定的 。篮子数目>数据个数
引自侯捷STL源码剖析。