本文主要记录一下STL中一些常见的容器(包括vector、deque、queue、list、stack、set、map),及其对应的常见的操作,不涉及更深层次原理性的知识。方便以后使用、查阅。
1、vector
vector 容器结构示意图:
vector:顺序存储容器,和数组非常相似,也被称为单端数组。只能从尾部增加删除元素。
vector 常见操作:
2、deque
deque 容器结构示意图:
deque:顺序存储容器,两端都可插入与删除,也被称为双端数组。虽然都是顺序存储容器,但是vector访问元素的速度要比deque快。
deque内部工作原理:
deque常见操作:
3、queue
queue 容器结构示意图:
queue:先进先出(First In First Out, FIFO)的存储容器(两端),只能从尾部插入、头部删除。
queue常见操作:
4、list
list 容器结构示意图:
list: 非连续的存储空间,是一个双向循环链表,动态存储分配。
list 常见操作:
5、stack
stack 容器结构示意图:
stack: 一种先进后出(First In Last Out, FILO)的数据结构,只有一个出口,只能在栈顶插入与删除。
stack 常见操作:
6、set/multiset
set: 集合,一种关联性容器。底层是红黑树实现的。
特点:
1)、所有元素在插入时自动被排序;
2)、set不允许容器中有重复的值,multiset允许容器中有重复的元素;
set常见操作:
7、map/multimap
map: 一种关联性容器。底层是红黑树实现的。
特点:
1)、map中所有的元素都是pair,其中pair第一个元素为key(键值),第二个元素为value(实值);
2)、所有元素都会根据元素的key(键值)自动排序;
3)、map中不允许有重复的key值元素,multimap中允许有重复的key值元素;
map 常见操作:
8、几种容器的对比
名称 | 类型 | 存储结构 | 支持迭代器 | 增加元素 | 删除元素 | 支持find | 随机访问 |
---|---|---|---|---|---|---|---|
vector | 顺序容器 | 连续存储空间 (数组) | 支持 | 尾部增加 (push_back) | 尾部删除 (pop_back) | 自己不支持find | 支持快速随机访问 |
deque | 顺序容器 | 连续存储空间 (双端数组) | 支持 | 尾部增加 (push_back) 头部增加 (push_front) | 尾部删除 (pop_back) 头部删除 (pop_front) | 自己不支持find | 支持快速随机访问 |
queue | 顺序容器 | 连续存储空间 (FIFO) | 不支持 | 队尾增加 (push) | 队头删除 (pop) | 不支持 | 不支持 |
list | 顺序容器 | 非连续存储空间 (双向循环链表) | 支持 | 尾部增加 (push_back) 头部增加 (push_front) | 尾部删除 (pop_back) 头部删除 (pop_front) | 自己不支持find | 不支持 |
stack | 顺序容器 | 连续存储空间 (FILO) | 不支持 | 栈顶增加 (push) | 栈顶删除 (pop) | 不支持 | 不支持 |
set | 关联容器 | 红黑树 | 支持 | insert | erase | 支持 | —— |
map | 关联容器 | 红黑树 | 支持 | insert [] 赋值 | erase | 支持 | —— |
PS:
- 对于自己不支持find(即,成员函数没有find)的,可以使用泛型算法进行find;
- 只有list自己含有sort成员函数,其它能排序(vector、deque)的容器只能调用泛型算法;
- 对于 erase 操作,对于序列容器vector,deque来说,使用erase(itertor)后,后边的每个元素的迭代器都会失效,但是后边每个元素都会往前移动一个位置,但是erase会返回下一个有效的迭代器; 对于关联容器map set来说,使用了erase(iterator)后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素的,不会影响到下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可。 对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的iterator。