1、顺序容器
vector
向量容器。底层是动态开辟的一维数组.
1.实现原理(关键在于对其大小的控制以及重新配置时的数据移动效率)
Vector是C++STL标准模板库中的顺序容器,底层是一个内存可增长的数组动态空间,随着元素的增加,它的内部机制会自行扩充空间用来容纳新元素,每次以2倍的方式另外分配一块空间,然后将内容拷贝,之后在原内容之后构造新元素,并释放原来的空间。因此一旦引起空间重新分配,只想原来的vector的所有迭代器都会失效。
2.操作的时间复杂度
Push_back O(1) insert O(n)
pop_back O(1) erase O(n)
访问 O(1)
3.和数组的区别
Vector长度不固定,数组是固定长度,必须实现定义好,没有vector灵活。如果在堆上开辟一块数组内存的话,不但要维护数组的长度,要是堆上的数组内容满了就必须自己处理对数组进行扩容,增大代码的复杂度,管理数组的代码和处理业务的代码混到一块,增加代码耦合程度,不利用体现的高内聚、低耦合的思想。
Vector提供了size,push_back,swap等比较好用的方法,帮助我们直接实现代码上想要的逻辑,速度比数组快
Vector可以实现更复杂的数据结构,vector<vector<int>>,相当于二维数组,但是二维数组的每一行都是长度一样的,而vector实现的二维数组,很灵活。
4.使用vector时的注意事项
Insert是在所指的元素之前进行插入,erase返回的迭代器指向被最后删除的元素的下一个元素
插入和删除元素后迭代器失效问题
预先知道所需空间可以使用reserver预先分配内存
- reserve():是用来预留容量的,并不会改变容器的有效元素个数。即用reserve()开辟空间时,仅改变capacity大小,与size无关。
- resize(): 它主要用来调整容器有效元素的个数,有时候也会造成容量的改变。因此用resize()开辟空间时,会对增加的空间全部进行初始化,使得有效元素个数增加。
- 容量: 即capacity,是指容器在自由内存中获得存储空间的大小
- 大小: 即size,指的是容器中实际(有效)元素的个数
list
列表容器。底层是带头节点的双向链表容器
1.各种时间复杂度
Push_back O(1) insert O(1)
Push_front O(1) erase O(1)
Pop_back O(1) 访问 O(n)
Pop_front O(1) 自带sort()函数
2.Vector和list的区别
Vector和list是C++STL里面的两个顺序容器,vector底层是一个内存可以2倍增大的一维数组,list底层是一个带有头节点的双向链表,因此vector更适合可以通过下标随机访问和末尾的增加删除场景,时间复杂度为O(1),list更适合任意位置删除和增加情况比较多的场景,时间复杂度为O(1)。
deque
双端队列容器。底层是动态开辟的二维数组
1.各种时间复杂度
Push_back() O(1) 访问 O(1)
Push_front O(1) insert O(n)
Pop_back O(1) erase O(n)
Pop_front O(1)
2.底层实现原理
Deque属于C++STL顺序容器中的一种,双端队列,底层是一个动态开辟的二维数组(称deque_map,但是它不是映射表map,就只是二维数组,一维的数组里放的全是指针,指向二维的分段连续的缓冲区buffer)。Deque底层的内存是分段连续的,整体不连续。底层的数据结构类似链地址法实现的哈希表数据结构,不过哈希表放的是链表,deque放的是数组。
3.Deque和vector的区别
Vector提供了push_back和pop_back尾端的插入删除,时间复杂度是O(1),但是vector首端插入删除效率低O(n),deque是双端队列,提供push_back pop_back push_front pop_front,尾部和首部的插入和删除,时间复杂度都为O(1)。但是如果从中间进行插入和删除操作时由于vector底层内存时连续的,效率要比deque高,所以一般首尾增删比较多的情况下选择deque,否则一般都是用vector。但是当数据量不大时,由于deque的第二维数组是事先分配好的内存,可以直接使用,初始操作效率高。Vector在如果大小不够还要进行2倍扩容,初始操作效率低。STL中的stack和queue默认就是依赖deque实现的,但是优先级队列priority_queue是依赖vector实现的,优先级队列底层默认是一个大根堆,构建效率高。
2、关联容器
Set/multiset
单重集合/多重集合。底层实现是红黑树
Map/multimap
单重映射表/多重映射表。底层实现是红黑树
底层实现:STL中的一种关联容器,存的是key-value键值对的映射表容器,有map和multimap,之间的区别就是map不允许key重复,而multimap允许key重复。底层是一棵红黑树,不严格的平衡二叉树,左右子树的高度差不能超过短子树高度的2倍,数据的增删查效率都比较高,平均时间复杂度在O(logn)。
3、容器适配器
stack
栈。底层默认依赖deuqe容器实现一个先进后出的栈结构
queue
队列。底层默认依赖deque容器实现一个先进先出的队列结构
priority_queue
优先级队列。底层默认依赖vector实现一个大根堆结构,默认值越大,优先级越高