栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STL源码剖析总结

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STL源码剖析总结

STL源码剖析总结——使用c++标准库

前段时间学习了STL,今日开始复盘,整理下汇总,图片均引自侯捷STL源码剖析

GP(Generic Programming)泛型编程最成功的就是STL(Standard Template Library),以头文件形式呈现,所有的头文件都在std标准命名空间内

为了代码的复用性,建立数据结构和算法的一套标准,以泛型编程思维建立各个抽象概念(迭代器、容器),并加以系统化

SGI STL:

为让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

11 unordered_multiset/unorderd_multimap/set/map

用哈希表做数据结构的

也是用insert

篮子里面有链表,每个链表里的数据不确定的 。篮子数目>数据个数

引自侯捷STL源码剖析。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971691.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号