STL容器
序列式容器
1.vector
** vector内部** vector较常使用的成员函数有:begin()、end()、size()、capacity()、empty()、operator[]、front()、back()… vector在进行两倍扩充的时候需要大量调用析构函数和构造函数,因为它要释放之前空间中申请的空间,并且需要重新开辟空间去存放新放入的元素。 GUN4.9版本中vector容器的内部构造如下: 可以看出vector迭代器占12个字节(内部有三个指针)。
2.array
TR1中的array内存模型:
3.forward_list
forward_list是一个单向链表,在GUN4.9新加进来的:
deque
如上图所示,deque分段连续。 deque的控制中心是一个vector,所以其扩充是和vector扩充方式一样,两倍扩充。
deque的迭代器大小有16个字节。 deque本身有40个字节。 deque成员函数insert()内部判断插入位置点离起始点和结束点哪个比较近,之后插入传入迭代器中的位置中。 deque的迭代器++和–操作重载如下: GUN4.9中定义deque:
stack和queue
stack和queue都是通过底层调用deque来实现自己的功能的。 stack和queue不能遍历,也不提供iterator。 stack和queue不仅可以使用deque作为底层也可以使用list作为底层使用,但是不能使用vector、set、map作为底层进行构造。
关联式容器
关联式容器的查找和安插数据都很快,因为其底层实现决定了这些特性都很快。 关联式容器底层有两种实现方式:rb-tree和hash table。
rb-tree
rb tree是平衡二叉搜索树。 GUN2.9版本rb tree实现: rb-tree有12个字节 GUN4.9版本实现: 每个rb-tree有24个字节
set/multiset
set容器底部源码: 因为set和multiset底层使用rb-tree来进行实现功能,所以我们可以称其为容器适配器(container adapter)。 multiset容器气势上与set差不多,但是其底层的插入是使用insert_equal()来实现的,所以其可以插入key值相同的元素。
容器map、multimap
map底层实现: map通过[]进行查询元素时,如果map里面存在这个索引值对应的元素,则返回这个元素的迭代器,如果map里面不存在此元素,则将此索引值按照一个元素值插入到map中。
hashtable
一开始的时候是按照左上方的方式实现hashtable的,但是如果同一个链表下的元素过多的时候查找的时候速度会特别的慢,所以有了如下调整:在元素的个数大于等于篮子的个数的时候需要重新rehashing,大散散列表重新进行计算并排列元素,一般扩充篮子的数量是质数(这里起始是53(按照平台不同而不同),以后就是扩充到53倍数最近的一个质数,也就是右上角的个数,这些数字是在GUN2.9版本下)。 hashtable的底层实现为:
unordered
到了C++11之后hashtable容器改名为unordered,如:hash_set、hash_multiset、hash_map、hash_multimap------>unordered_set、unordered_multiset、unordered_map、unordered_multimap。 下面测试是在GUN4.9版本下: 容器的内容就以上这么多了,以上截图都是侯捷老师网课的内容。
|