一、标准库顺序容器适配器的种类
标准库提供了三种顺序容器适配器:queue(FIFO队列)、priority_queue(优先级队列)、stack(栈)
二、什么是容器适配器
首先,我们要明白适配器是干什么的?其实就是一个接口转换装置,是得我们能用特定的方法去操作一些我们本来无法操作的东西。举一个例子,比如你的一个设备支持串口线,而你的电脑支持的是usb口,这时候,我们没有必要重新买一个支持usb的设备,只需要一根串口转usb口的小玩意,让你的设备能够连接到usb插口上,而它就是适配器。
那么C++中的容器适配器是干什么的呢?可以做一个类比,我们已有的容器(比如vector、list、deque)就是设备,这个设备支持的操作很多,比如插入,删除,迭代器访问等等。而我们希望这个容器表现出来的是栈的样子:先进后出,入栈出栈等等,此时,我们没有必要重新动手写一个新的数据结构,而是把原来的容器重新封装一下,改变它的接口,就能把它当做栈使用了。
言归正传,理解了什么是适配器以后,其实问题就很简单的。C++中定义了3种容器适配器,它们让容器提供的接口变成了我们常用的的3种数据结构:栈(先进后出)队列(先进先出)和优先级队列(按照优先级(“<”号)排序,而不是按照到来的顺序排序)。
至于具体是怎么变的,我们可以先了解一个大概:默认情况下,栈和队列都是基于deque实现的,而优先级队列则是基于vector实现的。当然,我们也可以指定自己的实现方式。但是由于数据结构的关系,我们也不能胡乱指定。栈的特点是后进先出,所以它关联的基本容器可以是任意一种顺序容器,因为这些容器类型结构都可以提供栈的操作有求,它们都提供了push_back、pop_back和back操作。 队列queue的特点是先进先出,适配器要求其关联的基础容器必须提供pop_front操作,因此其不能建立在vector容器上;对于优先级队列,由于它要求支持随机访问的功能,所以可以建立在vector或者deque上,不能建立在list上。
三、容器适配器
要使用适配器,需要加入一下头文件:
#include <stack> //stack
#include<queue> //queue、priority_queue
种类 | 默认顺序容器 | 可用顺序容器 | 说明 |
---|---|---|---|
stack | deque | vector、list、deque | |
queue | deque | list、deque | 基础容器必须提供push_front()运算 |
priority_queue | vector | vector、deque | 基础容器必须提供随机访问功能 |
四、定义适配器
1、初始化
stack<int> stk(dep);
2、覆盖默认容器类型
stack<int,vector<int> > stk;
五、容器适配器的使用
1、下面的程序读入一系列单词存储在stack中,然后再显示输入的单词。
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
stack<string> words;
string str;
cout<<"Enter some words(Ctrl + Z to end):"<<endl;
while(cin >> str)
{
words.push(str);
}
while(words.empty() == false)
{
cout<<words.top()<<endl;
words.pop();
}
return 0;
}