容器适配器:stack、queue和priority_queue(C++ Primer 5th)

0前言

除了顺序容器外,标准库还定义了三个顺序容器适配器: stack、queue 和priority_queue。适配器(adaptor)是标准库中的一个通用概念。容器、迭代器和函数都有适配器。本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型。例如,stack适配器接受一个顺序容器(除array或forward_list外),并使其操作起来像一个stack一样。表9.17列出了所有容器适配器都支持的操作和类型。
在这里插入图片描述

1定义一个适配器

每个适配器都定义两个构造函数:默认构造函数创建一个空对象,接受一个容器的构造函数拷贝该容器来初始化适配器。例如,假定 deq是一个deque,我们可以用deq来初始化一个新的stack,如下所示:

stack<int> stk(deq); //从deq拷贝元素到stk

默认情况下,stack和 queue是基于deque实现的,priority_queue是在vector之上实现的。我们可以在创建一个适配器时将一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。

//在vector上实现的空栈
stack<string, vector<string>> str_stk;
//str_stk2在vector上实现,初始化时保存svec的拷贝
stack<string, vector<string>> str_stk2(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构造

1.1栈适配器

stack类型定义在stack头文件中。表9.18列出了stack所支持的操作。下面的程序展示了如何使用stack:

stack<int> intStack; //空栈
//填满栈
for (size_t ix =0; ix != 10; ++ix)
intStack.push(ix); //intStack保存0到9十个数
while (!intStack.empty()) { //intStack中有值就继续循环
    int value = intStack.top(); //使用栈顶值的代码
    intStack.pop(); //弹出栈顶元素,继续循环
}

其中,声明语句

stack<int> intStack; //空栈

定义了一个保存整型元素的栈intStack,初始时为空。for循环将10个元素添加到栈中,这些元素被初始化为从0开始连续的整数。while循环遍历整个stack,获取top值,将其从栈中弹出,直至栈空。
在这里插入图片描述每个容器适配器都基于底层容器类型的操作定义了自己的特殊操作。我们只可以使用适配器操作,而不能使用底层容器类型的操作。例如,

intStack.push(ix); //intStack保存0到9十个数

此语句试图在intStack的底层deque对象上调用push_back。虽然stack是基于deque实现的,但我们不能直接使用deque操作。不能在一个stack上调用push_back,而必须使用stack自己的操作——push。

1.2队列适配器

queue和priority_queue适配器定义在 queue头文件中。表9.19列出了它们所支持的操作。
在这里插入图片描述
在这里插入图片描述
标准库queue使用一种先进先出(first-in,first-out,FIFO)的存储和访问策略。进入队列的对象被放置到队尾,而离开队列的对象则从队首删除。饭店按客人到达的顺序来为他们安排座位,就是一个先进先出队列的例子。
priority_queue 允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比它低的已有元素之前。饭店按照客人预定时间而不是到来时间的早晚来为他们安排座位,就是一个优先队列的例子。默认情况下,标准库在元素类型上使用<运算符来确定相对优先级。我们将在11.2.2节(第378页)学习如何重载这个默认设置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值