stl源码剖析学习笔记(一)
本系列都是基于SGI STL.
1、vector
线性连续空间 capacity() size() empty()。 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了
capacity()的实现是return size_type(end_of_storage - begin());
size()的实现是return size_type(end()-begin());
empty()的实现是return begin()==end();
end() return finish;
begin() return start;
begin() end()符合stl的前闭后开规范
2、list
双向循环链表
3、deque
双向开口‘连续’空间 其连续性是通过很多个map指针映射小块连续内存区域保证的,假连续。决定了其修改操作效率极低。连基本的排序,最好都先拷贝到vector中排序号再拷回来。应用场合?
4、stack、queue
stack先进后出,queue先进先出,结构连续简单。其底层结构是sequence
5、heap(不是stl的容器组件,是幕后英雄)
找list中的极值,需要线性扫描list。stl用的是完全二叉树,而且是大顶堆。
此处可以引入堆的push、pop和sort算法介绍。
heap相关的push、pop和sort操作全部都在algorithm头文件内。
前五个均称为序列式容器,可序的,对序列性有一定需求。
关联式容器是Key-Value方式访问,对序列性无需求。
1、平衡二叉树/AVL树
2、红黑树
3、set/map/multiset/multimap
4、hashtable/hashset/hashmap/hashmultiset/hashmultimap