STL六大组件的交互关系
container通过allocator取得数据存储空间,algorithm通过iterator存取container中的内容,functor协助algorithm完成不同的策略变化,adapter修饰functor.
STL 的核心思想
把数据容器与算法分开,彼此独立设计。
1.vector
动态增长机制:GCC以2的指数速度增长,vs以1.5倍的速度增长。
而在不断pop的过程中,无论原先分配的空间有多大,都不会动态减少。
迭代器特性:可以以普通指针做迭代器。一旦引起空间重新配置,指向vector的所有迭代器就都失效了。
2.List
List基于双向链表实现
List的插入、删除或者拼合操作不会造成原有迭代器的失效。
List不能用STL 中的sort函数进行排序,而是要用自身的sort函数。List仅支持随机访问迭代器,而List是双向迭代器。
3.deque
是一个双向队列
将数据分为多个存储区域,存储区域的指针存储在map存储区中,当map区域不够大时可以动态增长。所以deque可以在常数时间在首尾进行存取操作,也支持随机访问。
但是代价就是复杂的迭代器,从而导致在许多方面表现的都比vector差。
4.statck
statck可以基于多种容器实现,默认是基于deque
statck只能在尾部对元素进行存取,不允许遍历行为,不提供迭代器。
5.queue
可以基于多种容器实现,默认是deque
值允许在尾部添加元素,在首部删除元素,不允许遍历行为,不提供迭代器。
6.heap
int myints[] = { 1,3,5,2,4,6 }; vector<int> v(myints, myints + 5); make_heap(v.begin(), v.end());//默认大顶堆 v.push_back(0); push_heap(v.begin(), v.end());//先插入数据再调用函数 pop_heap(v.begin(), v.end());//把位于堆顶的元素移至vector的末尾 v.pop_back();//要先pop_heap sort_heap(v.begin(),v.end());//默认从小到大排序
7.priority_queue
8.RB-tree
9.set
10.map
不能通过迭代器改变key值,但是可以改变value值,删除和插入操作不会使之前的迭代器失效。
Insert操作返回的是pair,first是被插入元素的迭代器,second是bool,表示是否插入成功
Mulimap、mulitset与普通的map和set差不多,只不过是允许有重复值。
11.hash_table
线性探测:f(value)=value%length+i;
二次探测:f(value)=value%length+i^2
开链:相同key值的value以链表的方式保存在同一个桶中。当元素个数大于桶的个数时就重建,然后再插入重建后的相应位置。
hash_map和hash_set都是基于hash_table.
vs说hash_map和hash_set都过时了,要用unordered_map,unorder_set,性能最佳。