9-6 容器适配器

何为适配器

适配器( adaptor)是标准库中的一个通用概念。容器、迭代器和函数都有适配器。

本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样

一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型。例如,stack适配器接受一个顺序容器(除array或forward_list外),并使其操作起来像一个stack一样。

所有容器适配器都支持的操作和类型:

image-20220223111440100

定义一个适配器

默认实现的容器类型#

默认情况下,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头文件中

image-20220223112527055

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头文件中

image-20220223113107050

image-20220223113116798

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
}
posted @   咪啪魔女  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示