容器分类:
array:
* array大小固定,不可改变
* 在内存中是连续的
* 获取元素的复杂度是常数,与array元素个数无关
* 是对原始数组的封装,也可以获取原始数组的指针
* 如果数组大小固定,尽量使用array,而不是使用C++原生数组,因为array可以使用标准库的算法
vector:
* vector是一个动态数组,可以随意增加元素
* 与array一样,vector在内存中是连续的,对应的内存空间会随着元素的增加而增加
* 获取元素的复杂度是常数,与vector的大小无关
* 在vector末尾增加、删除元素的复杂度是常数,与vector的大小无关
* 在vector中间增加、删除元素的复杂度是线性的,与vector的大小有关
* 可以使用迭代器和算法
deque:
* 动态数组,和vector类似,但是deque是双端的,可以在头部和尾部进行插入和删除操作
* 与vector不同,deque在内存中是分段连续的,每段内存都是连续的,所以在头部和尾部插入和删除元素都很快
* 获取元素的复杂度是常数
* 在头部和尾部插入和删除元素的复杂度是常数
* 在中间插入和删除元素的复杂度是线性的
* 支持迭代器和算法
list:
* 动态大小
* list是一个双向链表,支持快速的插入和删除操作
* list不支持随机访问,不支持下标运算符
set:
* set是一种关联式容器
* 根据元素的值,自动排序,重复元素会被自动去重
* 不支持随机访问,不支持下标运算符
* 支持各种迭代器和算法
map:
* map是一种关联式容器,它的元素是key-value对(std::pair),key是唯一的,value可以重复
* map中的元素是按key自动排序的
* 使用key访问元素
stack:
* stack 是一种容器适配器,遵循后进先出(LIFO)的原则
* stack 本身不是容器,它是基于容器实现的(如vector、list、deque等)
* 所有的操作都在栈顶进行(top)
* stack 本身没有迭代器
queue:
* queue是一种容器适配器,遵循先进先出(FIFO)的原则
* queue的底层容器可以是deque、list
* 元素只能从队尾压入,从队首弹出(排队)
* queue本身没有提供迭代器
priority_queue(优先级队列):
* 允许按照优先级来插入和删除元素
* 优先级最高的元素总是位于队首(最大值在队首)
* 本身没有提供迭代器