介绍下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()变小是删除元素吗
参考资料
TODO
- STL下sort()的内部实现,stable_sort()内部实现,lower_bound()内部实现;
- 举例STL的一种算法答:比如find、accumulate、next_permutation、unique、position等等
- 如果我用一个int类型的指针,指向一个vector中的元素,会怎么样?
- 堆的STL实现;手写堆的删除支持任意一个节点的删除,不过STL只支持堆顶删除,STL堆的实现
- hashtable内部实现?
- 以上是搜索精华帖看到第三页