容器适配器

概念

        适配器(Adaptors)是标准库中的一个通用概念,容器、迭代器和函数都有适配器。本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。一个容器适配器(Container adaptors)接受一种已有的容器类型,使其行为看起来像一种不同的类型。标准库定义了三个序列容器适配器:stack、queue和priority_queue。

通用操作和类型

定义一个适配器

        每个适配器都定义两个构造函数:默认构造函数创建一个空对象,接受一个容器的构造函数拷贝该容器来初始化适配器。
std::vector<int> deq;
std::stack<int> stk(deq);//从deq拷贝元素到stk
        默认情况下,stack和queue是基于deque实现的,priority_queue是在vector之上实现的。我们可以在创建一个容器适配器时将一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。
std::stack<string, std::vector<string>> str_stk;//在vector上实现空栈
std::stack<string, std::vector<string>> str_stk2(svec);//str_stk2在vector上实现,初始化时保存svec的拷贝
        对于给定的适配器,可以使用哪些容器是有限制的。所有适配器都要求容器具有添加和删除元素的能力。因此,适配器不能构造在array之上。类似的,我们也不能用forward_list来构造适配器,因为所有适配器都要求容器具有添加、删除以及访问尾元素的能力。
        具体说来,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的特点是先进先出(FIFO,First In First Out),栈适配器默认基于deque实现,也可显式指明在list或vector上实现。除了拥有容器适配器都有的操作以外还可以进行如下操作:


        每个容器适配器都基于底层容器类型的操作定义了自己的特殊操作(虽然这些特殊操作有一部分实际上是调用了底层容器的成员函数)。我们只可以使用适配器操作,而不能使用底层容器类型的操作。

队列适配器

        队列适配器有queue和priority_queue两种,它们都定义在名为queue的头文件中。 queue默认基于deque实现,priority_queue默认基于vector实现。queue也可以用list或vector实现,priority_queue也可以用deque实现。
            queue使用一种先进先出(First-in, First-out, FIFO)的存储和访问策略。进入队列的对象被放置到队尾,而离开队列的对象则从队首删除。
            priority_queue允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比它低的已有元素之前。

队列适配器的额外操作有:


本文摘自《C++ Primer(中文版)第五版》
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值