C++中的容器
- stl库中有许多十分常用的容器
顺序性容器
vector
- vector是动态数组,在内存中有连续的存储空间,因此可以快速随机访问,但是插入和删除的效率比较慢,vector会初始化一个capacity,如果size大于等于这个值的时候,就会重新申请一份连续的内存空间,其大小是目前连续空间的2倍。这种方式性能消耗较大。
- vector有一个clear函数,用于清空数组,但是这只是将vector的size设置为0,其vector中的元素在内存中并未被删除,因此vector在使用的过程中,内存消耗会越来越多。可以采用swap的方法来防止内存泄露的问题,即将当前的vector与临时对象进行交换,之后临时对象会自动释放内存。
- vector是应用最为广泛的容器,如果不确定需要使用哪种容器,可以先使用vector进行尝试
list
- list是双向链表,它的内存空间是不连续的,通过指针来进行数据的访问,因此在随机存储过程中,显得十分低效;但是它可以很高效地进行任意位置元素的插入与删除
- list没有实现[]操作符的重载(毕竟内存空间不连续)
deque
- deque支持快速随机访问,这点与vector相似,但是vector只在末端插入数据时十分高效,而deque支持高效地在双端插入数据,deque的重新分配速度比vector要快
关联性容器
set与map
- set中的元素都是唯一的,map用唯一的关键字来映射对应的值,具有
kay-value
的功能。 - set与map的底层都是采用红黑树实现的,插入与删除操作时仅移动指针即可,效率很高,
- set中不能直接改变元素值,要改变元素值,必须首先删除旧元素,再插入新元素
- 因为set与map都是使用红黑树实现的,因此其占用的内存空间较大。
另外两种关联性容器
unordered_set与unordered_map
- 两者也是只能存储唯一的值与或者key,它们都是无序的,内部实现了哈希表,因此查找速度非常快( O(1) O ( 1 ) )。但是缺点是哈希表的建立比较耗费时间。
容器适配器
queue
- queue是队列,先入先出,是在deque的基础上进行封装的
stack
- stack是栈,先入后出,也是在deque的基础上进行封装的。