1. 容器
容器类型是用于创建具体容器对象的模板,c++ 11以前的11个容器类型是:deque, list, queue, priority_queue, stack, vector, map, multimap, set, multiset 和 bitset
c++11 新增了forward_list, unordered_map, unordered_multimap, unordered_set 和 unordered_multiset, 且不再将 bitset 视为容器,而是将其视为一种独立的类别。
一些基本的容器特征如下:
c++新增的容器要求
2. 序列
序列容器有deque, forward_list, list, queue, priority_queue, stack, vector, array也被归纳到序列容器,虽然不满足序列的所有要求。
序列要求元素按照严格的线性顺序排列,即存在第一个元素,最后一个元素,除第一个元素和最后一个元素以外,每个元素的前后都有一个元素,数组和链表都是序列,但是分支结构不是。
deque, list, queue, priority_queue, stack, vector, array都是序列概念的模型,都支持上面模型。
序列的可选操作
2. vector
vector是一种数组的类的表示,它提供了自动内存管理的功能,可以动态的改变vector对象的长度
vector是可反转容器,提供了两个类方法: rbegin()和rend(),前者返回反转序列的超尾迭代器.
3. deque
deque表示双端队列,支持随机访问,主要区别在于,deque的开始未知插入和删除 元素的时间是固定的,不像vector是线性时间,如果多数操作发生在队列的起始和结束位置,应当考虑使用deque数据结构
4. list
list表示双向链表,除了第一个和最后一个元素以外,每个元素都和前后的元素连接,意味着可以双向遍历链表,list与vector的区别在于,list在链表中任意位置插入和删除的时间都是固定的,(vector提供了除结尾外线性时间的插入和删除,在结尾处,提供了固定时间的插入和删除),因此,vector强调的是通过随机访问快速访问,list 强调的是元素的快速插入和删除。
vector也是可反转容器,不同的是,list 不支持数组表示法和随机访问,与矢量迭代器不同,在容器中插入和删除元素以后,链表迭代器指向的元素不变。
5, forward_list
forward_list是不能翻转的正向迭代器,单链表
6. queue
是一个适配器类,底层类为(deque),queue模板的限制比deque多,不允许随机访问队列元素,不允许遍历队列,可以将元素添加到队尾,从队首删除元素,查看队首和队尾元素的值,检查元素的数目和测试队列是否为空。
7. priority_queue
是一个适配器类,默认的底层类为vector,在优先队列中,最大的元素被移到队首。默认的底部类是vector,可以修改确定哪个元素放到队首的比较方式
priority_queue<int> pq;
priority_queue<int> pq(greater<int>); // use greater<int> to order
8. stack
是一个适配器类,默认的底层为vector,stack的限制比vector更多,不允许随机访问栈元素,不允许遍历栈,把使用限制在定义栈的基本操作上。将压入推到栈顶,从栈顶弹出元素,查看栈顶的值,检查元素的数目,测试栈是否为空。
9. array
并非stl容器,因为长度是固定的,array没有定义调整容器大小的操作,如push_back()和insert(),但是定义了operator[]()和at(),可以将很多的stl算法用于array,例如copy()和for_each()
10 关联容器
关联容器将值和键关联在一起,并使用键来查找值。stl 提供了四种关联容器,set, multiset, map, multiamp
set:键和值的类型相同,键是唯一的,集合中不会有多个相同的键,multiset 可能有多个值的键相同。\
The value of an element is also the key used to identify it. set的键和值相同,set默认是已经排序的。
map:键和值的类型不同,键是唯一的,集合中不会有多个相同的键,multimap 可能有一个键和多个值关联。