STL重要知识

介绍下STL:

STL是一个standard templeate library

封装了常用的数据结构和算法,用了泛型来包装方便使用,分为六大组件,我们直接使用的是容器,迭代器和算法,迭代器分为随即迭代器,双向迭代器两种,随机迭代器会面临一个失效的问题,在使用他们的时候要一些情况要接收返回值来防止迭代器失效,容器常用的vector,它的allocator很有意思,是包括两层分配器,第二级用一个内存池来减少内存碎片,其他常用的map用红黑树来实现,常用的算法有sort.内部使用的是一个内省算法,就是多种算法融合,当元素少的时候用...因为...自建元素如struct排序用..(稳定性)..内建类型用...当迭代数目到一定的时候用...因为...

六大组件:

  • .容器(Containers):.算法(Algorithms):
  • .迭代器(Iterators):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”,共有五种...
  • .仿函数(Functors):
  • .配接器(适配器)(Adapters):一种用来修饰容器(Containers)或仿函数.
  • allocator

内省算法

总结:

对于基本有序的小数组(比如10),使用插入排序的效率会比快速排序更高,

在递归到一定层次的时候,因为递归到一定阶段后,快排慢慢变有序,接近最差情况的几率也会变高,这时候会转用heap排序;

堆排序和快排比,总的来说是快排更快,一个是堆排序的时间复杂度常数更大,且优化的而快排最坏情况较少发生,快排比较的元素是相邻的,缺页次数相较于堆排序,(详细见参考资料1)

(TODO:如果是内建类型如int则用快排,如果是自建类型,如struct{ int num; int age;}则会用稳定的归并排序)

流程

算法首先判断排序节点个数,当小于16个时,直接使用O(n^2)的算法,否则使用quick sort,但是这里的quick sort会根据递归的深度来进行自动判断,当超出递归限度的时候,直接在对应区间调用heap sort算法,否则否则继续向深处递归。

当quick sort执行完后前后长度小于16时,不再进行递归,而是使用O(n^2)的算法对区间执行最后的整体整合即可实现intorSort算法。

另外:

stable()是归并排序,外排是稳定的,lower_bound()是二分查找

迭代器

vector的随机迭代器(是这个名字吧),list的双向迭代器,

Q:STL迭代器是怎么删除元素的呢,

迭代器失效

vector的扩容,删除,中间插入

遍历vector删除第奇数个的写法

vector空间配置器

两级空间配置器,128KB为界限,第二级为内存池(TODO不知道这里要总结的多详细)内存池的扩容refill要知道吗?

TODO,准备个连环炮

Q:空间配置器是一个vector一个吗

Q:一开始内存池分配多大

这个是两个空间配置器的博客https://blog.csdn.net/qq_26822029/article/details/82915529

这是内存池的实现代码https://github.com/oscarwin/MemoryPool

vector的扩容

内存池作用:防止内存碎片

首先是2倍的扩展,

Q:vector的扩容会导致旧的空间元素拷贝到新的空间,是移动构造吗,好像移动构造能保证vector中元素唯一性的问题?

Q:vector的扩容深拷贝和浅拷贝?

常用API

push_back的平均复杂度是O(1),emplace_back是对于push_back的优化,少调用一次移动/复制构造函数

reserver会改变vector的空间大小,也就是capacity(),可以防止扩容重新分配空间(reserve扩容会不会调用移动/复制构造函数)

resize相当于添加了元素,改变了size(),Q:resize()变小是删除元素吗

参考资料

  1. https://blog.csdn.net/sky453589103/article/details/51116264

TODO

  1. STL下sort()的内部实现,stable_sort()内部实现,lower_bound()内部实现;
  2. 举例STL的一种算法答:比如find、accumulate、next_permutation、unique、position等等
  3. 如果我用一个int类型的指针,指向一个vector中的元素,会怎么样?
  4. 堆的STL实现;手写堆的删除支持任意一个节点的删除,不过STL只支持堆顶删除,STL堆的实现
  5. hashtable内部实现?
  6. 以上是搜索精华帖看到第三页
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值