一、容器适配器之我见
C++中为了支持常用的数据结构队列、栈、优先队列等,采用偷懒的办法将原先的顺序容器通过适配器转换成这三个数据结构。默认情况下stack和queue是基于deque实现的,priority_queue是在vector上实现的。
什么是适配器?类比生活中我们经常要用的电源适配器,它是做电压转换的。类比到程序设计中其实也是为了完成需求和现有方法不相同的难题。适配器在我看来其实就是原有类的方法和数据的再封装,具体在这一节就是指在底层顺序容器之上新定义了接口的新容器。
设计模式中专门有一节就是介绍这种设计模式:适配器模式。其中有一句话让人印象深刻:适配器模式的使用场景是:在双方的接口都不容易修改的时候再使用适配器模式。比如中国和欧洲的电压等级不同,谁都认为自己应该是标准,那只能用适配器。再比如,姚明刚到NBA的时候,短期内不会英语,NBA球员也不会去学汉语,这个时候也需要一个适配器:翻译。
也就是说,C++偷懒了,并没有直接去实现一个栈(stack),但为了能够满足栈的需求,用vector或deque实现了栈的接口,但数据还是存在vector中的,用书中的话说就是vector表现出了stack的行为。
二、C++中的容器适配器
要使用适配器,需要加入一下头文件:
//要使用适配器,需要加入一下头文件:
#include <stack> //stack
#include<queue> //queue、priority_queue
适配器的定义:
1.stack<int> intstack;//定义一个空栈
2.stack<int> stk(deq);//deq是一个deque<int> ,可以用它来初始化一个新的stack;
3.stack<string,vector<string>> str_stk;//在vector上实现的空栈
4.stack<string,vector<string>> str_stk2(svec);//同样在vector上实现,初始化时保存svec的拷贝
使用案例:
#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;
}