STL源码剖析总结

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源码剖析。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值