C++STL之容器

C++STL 的全称叫做标准模板库,里面封装的C++常用的容器算法等,极大的避免的我们重复造轮子。STL 由6大部分组成:容器,算法,分配器,迭代器,适配器和仿函数。他们之间的关系如下图:


image.png

在6大部件中,最重要的是容器算法和分配器,从图中可以看出,分配器负责给容器分配内存,容器负责存放数据,而算法则负责操作数据。迭代器是一种类指针,它的行为和指针一样,可以指示出容器中元素的位置。适配器是对容器的再封装,适配器的行为是一种容器行为但是它本质上并不是一种容器。C++中容器又分为序列容器和关联容器,序列容器主要vector, deque, list, forward_list, array。 vector和array的底层数据结构都是数组,区别在于array要事先声明元素的个数,而vector可以不断的再最后面push_back进去。可以看到array的行为和C++的数组是很像的,vector是一种闭-开的容器,它一端封闭,一端开放,这种做法实现的原理实际上是vector初始的时候会有一个容量大小,如果超过了这个容量,vector会申请一块新内存,新内存的数据是原来的2倍大小,然后把原来的数据拷贝过去。

  vector<int> a;
    for(int i=0;i<100;i++)
    {
        a.push_back(i);
        cout<<a.capacity()<<endl;
    }

这段代码可以清楚的看到容量两倍增长的过程。

deque是双端队列,可以再两边插入和删除,也支持随机访问。deque再内存里面并不是连续的,他的实现原理是map 和缓冲区,如下图所示
image.png

deque中每个map的元素对应一段缓冲区,当当前缓冲区满了以后会再内存中寻找合适的地方建立下一段缓冲区并且再map中增加指向当前缓冲区的指针。所以deque再内存中是不连续的。stack和queue为什么叫做容器适配器是因为他们都是对deque的再封装。stack实际上是封闭的deque的一端,queue实际上是把一端和push和另一端的pop给去掉了。

list是双向换装链表。它也只能再一端push进去,每次push都会在内存中寻找合适地方并且增加一个指向该地方的指针。溶蚀该地址也是有一个指向当前最后节点的指针。
关联式容器主要有map multimap unordermap ,set multiset unorderset。map里面的元素是一个键值对(pair),它需要一个key 和一个value, map和multimap允许key 重复,set和multiset里面的元素是单个元素。map ,multimap ,set 和multiset的实现方式是红黑树,也就是一类二叉平衡查找树,它可以再插入和删除时保证容器有序,因此可以达到很快的查找事件复杂度。unordermap和unorderset 实现的方式时哈希表,也就是哈希散列函数,对于每个值会计算其哈希值,相同和的细致的元素会形成链表,它的查找事件比红黑树还要快,但是unordermap不保证容器有序。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容