容器适配器
除去顺序容器vector(向量,可变大小数组),deque(双端队列),list(双向链表),forward_list(单向链表),array(固定数组大小,array的大小不可变)外,标准库还定义了三个顺序容器适配器(stack、queue、priority_queue)。
适配器是标准库中一个通用的概念,包含有容器适配器、迭代器适配器和函数适配器。
本质上,适配器是使一事物的行为类似于另一类事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。例如,stack适配器可使任何一种顺序容器以栈的方式工作,当然你也可以只用容器啊,不使用适配器,这样更灵活。
1、定义一个适配器
每个适配器都定义了两个构造函数:
1、默认构造函数构造一个空对象,例如:stack stk;
2、通过一个容器的拷贝来初始化适配器,例如:
stack<string,vector<string>> str_stk;//在vector上实现空栈
stack<string,vector<string>> str_stk2(svec);//str_stk2在vector上实现,初始化时保存svec的拷贝
注:所有的适配器都要求容器具有添加和删除元素的功能,因此array和forward_list没有适配器。
适配器种类 | 默认顺序容器 | 可用顺序容器 | 说明 |
---|---|---|---|
stack(栈) | deque | deque、vector、list | 由于array和forward_list不能提供push_back、pop_back和back操作,所以不能使用array和forward_list构造stack。 |
queue(队列) | deque | deque、list | queue适配器要求back、push_back、font和pop_front,所以不能使用vector构造 |
priority_queue(优先队列) | vector | vector、deque | priority_queue除了需要front、push_back和pop_back操作之外还要求随机访问能力,所以不能使用list |
2、栈适配器
使用stack需要引入头文件#include < stack>
支持的顺序容器:deque、vector、list。默认支持deque。
栈适配器的特有操作:
s.pop():删除栈顶元素,但不返回该元素值(通过调用底层容器的pop_back()操作实现)
s.push(item):创建一个新元素压入栈顶,该元素通过拷贝或移动item而来的(通过调用底层容器的push_back()操作实现的)
s.emplace(args):压入由args构造的元素进入栈顶(也是通过调用底层容器的emplace_back())操作实现的)
s.top():返回栈顶元素,但是不能将元素弹出栈(通过调用底层容器的back()操作实现的)
s.empty():判断s是否为空,空返回true,否则返回false(通过调用底层容器的empty()操作实现的)
s.size():返回s中的元素个数(通过调用底层容器的size()操作实现的)
注:虽然这些操作是基于底层容器实现的,但是我们必须使用适配器自己的操作。
为了获得最佳性能,应使用vector类作为stack的底层容器
3、queue适配器
使用queue需要引用头文件#include< queue>
支持的顺序容器:deque,list。默认支持deque。
队列适配器的特有操作:
q.pop():删除queue的首元素(通过调用底层容器的pop_front()实现的)
q.push(item):在queue末尾添加创建一个值为item的元素(通过调用底层容器的push_back()操作实现)
q.emplace(args):在queue末尾添加一个由args构造的元素(通过调用底层容器的emplace_back()操作实现的)
q.front():返回首元素的引用(通过调用底层容器的front()操作实现的)
q.back():返回尾元素的引用(通过调用底层容器的back()操作实现的)
q.empty():判断s是否为空,空返回true,否则返回false(通过调用底层容器的empty()操作实现的)
q.size():返回s中的元素个数(通过调用底层容器的size()操作实现的)
4、priority_queue适配器
使用priority_queue需要引用头文件#include < queue>
支持的顺序容器:vector,queue。默认是vector。
priority_queue类,能按照有序的方式在底层数据结构中执行插入、删除操作。
priority_queue的特有操作:
q.pop():删除优先队列priority_queue的最高优先级元素(通过调用底层容器的pop_back()实现的)
q.push(item):在priority_queue优先级顺序合适的位置添加创建一个值为item的元素(通过调用底层容器的push_back()操作实现)
q.emplace(args):在priority_queue优先级顺序合适的位置添加一个由args构造的元素(通过调用底层容器的emplace_back()操作实现的)
q.top():返回priority_queue的首元素的引用(通过调用底层容器的front()操作实现的)
q.empty():判断s是否为空,空返回true,否则返回false(通过调用底层容器的empty()操作实现的)
q.size():返回s中的元素个数(通过调用底层容器的size()操作实现的)
swap(q,p):交换两个优先队列priority_queue p,q的内容,p和q的底层容器类型也必须相同(通过调用底层容器的swap()操纵实现的)