9-6 容器适配器
何为适配器
适配器( adaptor)是标准库中的一个通用概念。容器、迭代器和函数都有适配器。
本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。
一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型。例如,stack适配器接受一个顺序容器(除array或forward_list外),并使其操作起来像一个stack一样。
所有容器适配器都支持的操作和类型:
定义一个适配器
默认实现的容器类型#
默认情况下,stack和queue是基于deque实现的, priority_queue是在vector之上实现的。
所以可以直接用一个deque来初始化stack
stack<int> stk(deq); //从deq拷贝元素到stk
指定实现的容器类型#
在创建适配器时可以指定实现该适配器的容器类型
//在vector上实现的空栈
stack<string, vector<string> > str_stk;
//str_stk2在vector的基础上实现,初始化时保存svec
stack<string, vector<string> > str_stk2(svec);
stack只要求push_back、pop_back和back操作,因此可以使用除array和 forward_list之外的任何容器类型来构造 stack。
queue适配器要求 back、push_back、front和 push_front,因此它可以构造于list或deque之上,但不能基于vector构造。
priority_queue除了front、push_back和 pop_back操作之外还要求随机访问能力,因此它可以构造于vector或deque之上,但不能基于list构造。
两种常见适配器
栈适配器#
定义在stack头文件中
int main(){
stack<int> intStack; //声明空栈
for(int ix = 0; ix != 10; ++ix)
intStack.push(ix); //将元素入栈
while(!intStack.empty()){
cout<<intStack.top()<<" "; //查看栈顶元素
intStack.pop(); //将元素弹出栈
}
return 0;
//输出:9 8 7 6 5 4 3 2 1 0
}
每个容器适配器都基于底层容器类型的操作定义了自己的特殊操作。我们只可以使用适配器操作,而不能使用底层容器类型的操作。例如,
intStack.push(ix) ; //intStack保存0到9十个数
此语句试图在intStack 的底层 deque对象上调用push_back。虽然stack是基于deque实现的,但我们不能直接使用deque操作。不能在一个stack上调用push_back,而必须使用stack自己的操作———push。
队列适配器#
queue和priority_queue定义在queue头文件中
int main(){
queue<int> intStack; //声明空栈
for(int ix = 0; ix != 10; ++ix)
intStack.push(ix); //将元素入栈
while(!intStack.empty()){
cout<<intStack.front()<<" "; //查看栈顶元素
intStack.pop(); //将元素弹出栈
}
return 0;
//输出:0 1 2 3 4 5 6 7 8 9
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具