容器适配器

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

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

size_type      一种类型,足以保存当前类型的最大对象的大小

value_type     元素类型

container_type     实现适配器的底层容器类型

A a;          创建一个名为a的空适配器

A a(c);       创建一个名为a的适配器,带有容器c的一个拷贝

关系运算符      每个适配器都支持所有关系运算符:==、!=、<、<=、>和>=,这些运算符返回底层容器的比较结果

a.empty()      若a包含任何元素,返回false,否则返回true

a.size()       返回a中的元素数目

swap(a,b)       交换a和b的内容,a和b必须有相同的类型,包括底层容器类型也必须相同

a.swap(a,b)

定义一个适配器

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

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

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

//vector上实现的空栈

stack<string,vector<string>> str_stk;  //默认是在deque上实现的,这里显示的指定为在vector上实现

//str_stk2在vector上实现,初始化时保存svec的拷贝

stack<string,vector<string>> str_stk2(svec);

对于一个给定的适配器,可以使用哪些容器是有限制的。所有适配器都要求容器具有添加和删除元素的能力。因此,适配器不能构造在array之上。类似的,我们也不能用forward_list来构造适配器,因为所有适配器要求容器具有添加、删除以及访问尾元素的能力。stack只要求push_back、pop_back和back操作,因此可以使用除array和forward_list之外的任何容器类型来构造stackqueue适配器要求back、push_back、front和push_front,因此它可以构造与list和deque之上,但不能基于vector构造priority_queue除了front、push_back和pop_back操作之外还要求随机访问能力,因此它可以构造于vector和deque之上,但不能基于list构造

栈适配器

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

stack<int> intStack;  //空栈
//填满栈
for(size_t ix=0;ix!=10;++ix)
    intStack.push(ix);
while(!intStack.empty())
{
    //使用栈顶的值
    int value=intStack.top();
    //弹出栈顶的元素,继续循环
    intStack.pop();
}
栈操作

栈默认是基于deque实现,也可以在list或vector上实现

s.pop()       删除栈顶元素,但不返回该元素的值

s.push(item)    创建一个新元素压人栈顶,该元素通过拷贝或移动item而来,或者由args构造

s.emplace(args)  

s.top()      返回栈顶元素,但不将元素弹出栈

每个容器适配器都基于底层类型的操作定义了自己的特殊操作。我们只能使用适配器操作,而不能使用底层容器类型的操作。例如:

intStack.push(ix);

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

队列适配器

queue和priority_queue适配器定义在queue头文件中。下表列出了它所支持的操作:

queue和priority_queue的操作

queue默认基于deque实现,priority_queue默认基于vector实现;

queue也可以由list或vector实现,priority_queue也可以用deque实现

q.pop()         返回queue的首元素或priority_queue的最高优先级的元素,但不删除此元素

q.front()        返回首元素或尾元素,但不删除此元素

q.back()        只适用于queue

q.top()       返回最高优先级元素,但不删除该元素,只适用于priority_queue

q.push(item)    在queue末尾或priority_queue中恰当的位置创建一个元素。其值为item,或者由args构造

q.emplace(args)  

标准库queue使用一种先进先出的存储和访问策略。进入队列的对象被放置在队尾,而离开队列的对象则从队首删除。

priority_queue允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比它低的已有元素之前。

容器适配器,布布扣,bubuko.com

时间: 2024-10-08 21:54:23

容器适配器的相关文章

5.0 容器适配器

STL中容器适配器有stack  queue  priority_queue共三种.他们都是在顺序容器的基础上实现的,屏蔽了顺序容器的一部分功能,突出或增加了另一些功能.容器适配器都有三个成员函数:push ,pop,top. 1)push:添加一个元素 2)top:返回顶部(对stack)或队头(对queue,priority_queue)的元素的引用. 3)pop:删除一个元素. 容器适配器上是没有迭代器的,所以在STL中的各种排序,查找,变序算法都不适用于容器适配器.

c++ 顺序容器学习 - 容器适配器

摘要: 对 容器适配器 的疑问. 刚开始接触 容器适配器 时,总感觉怪怪的,认为多此一举,顺手搜了搜,原来我在这一点is not alone: STL容器适配器的用途 其中有个老兄说的好,这里 引用一下: 1 adapter原意是插座.适配器.接合器的意思.现在我需要一个栈结构,我们可以用deque来实现,只在一端进行元素插入和弹出,另一端不动.这说明deque可以用作一个栈结构,但它又不能直接地严格地满足你的要求,因为你不能防止别人在另一端乱动你的东西.你需要对它进行一些包装,作一些限制,使之

STL之容器适配器stack的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 一提到适配器(adapter).我们就想到了早期用电话线上网所用的调制解调器,俗称"猫"."猫"的作用是实现数模转化和模数转化,在client,它能够将电话的模拟信息转化为我们计算机能够接收的数字信息,所以猫相当于一个转换器.再举个更加好理解的样例来说明"适配器"的含义.相信在我们每一个人的家里都有插排,如果就这么一种情况.如今我们家里的墙壁上仅仅有一个三角的插口,而我们的电视却是两个口,怎么办

C++ 模板 之 类型萃取 与 容器适配器

类型萃取 在模板这里主要就是对于模板的不同类型的实例化 有不同的方案 这样可以提高效率等 比如 下面的 顺序表 在扩容时的拷贝 对于没有含有指向空间的指针的类 如int 自动使用memcpy() 对于含有指向空间的指针的类 如string 就自动一个一个的赋值 防止浅拷贝导致两个指针指向同一空间 析构两次时出错 类型萃取实现 主要用到了 模板  模板特化 内嵌型别  也可用函数重载 详见Copy() //(1)-------类型萃取 实现顺序表 //----------------------C

C++ Primer 学习笔记_55_STL剖析(十):容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例

七种基本容器:vector.deque.list.set.multiset.map.multimap 一.容器适配器 stack queue priority_queue stack.queue.priority_queue 都不支持任一种迭代器,它们都是容器适配器类型,stack是用vector/deque/list对象创建了一个先进后出容器:queue是用deque或list对象创建了一个先进先出容器:priority_queue是用vector/deque创建了一个排序队列,内部用二叉堆实

C++ 容器:顺序性容器、关联式容器和容器适配器

什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种"对象"还包含了一系列处理"其它对象"的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是"容器类是一种对特定代码重用问题的良好的解决方案". 容器还有另一个特点是容器可以自行扩展.在解决问题时

容器适配器、STL算法简介

可以用某种顺序容器来实现 (让已有的顺序容器以栈/队列的方式工作) 1) stack: 头文件 <stack> 栈 -- 后进先出 2) queue: 头文件 <queue> 队列 -- 先进先出 3) priority_queue: 头文件 <queue> 优先级队列 -- 最高优先级元素总是第一个出列 都有3个成员函数: push: 添加一个元素; top: 返回栈顶部或队头元素的引用 pop: 删除一个元素 容器适配器上没有迭代器 STL中各种排序, 查找, 变序

STL之容器适配器priority_queue的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 在前面的文章STL之heap相关操作算法中介绍了堆的相关操作算法,由于堆的注意主要作用是用于排序,我们也知道堆排序的时间复杂度为o(nlogn),是一种不稳定的排序算法,利用堆这一数据结构,我们可以很快第获取一个大数据中最大(或最小)的k个数.同时,上篇文章中,也提出了相关heap算法的一些问题. 问题1:在调用push_heap函数实现向堆中插入元素之前,我们必须要先将向底层容器的末端插入该元素,然后才能调用push_heap内部的向上调整来

STL之容器适配器queue的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 上篇文章STL之容器适配器stack的实现框架已经介绍了STL是如何借助基础容器实现一种常用的数据结构stack (栈),本文介绍下另外一种STL内部定义的另外一种STL容器适配器queue(队列). 对于接触过数据结构的人来说,队列并不陌生,它是一种FIFO(first in first out)的数据结构.与栈相比,队列的不同之处在于:(1)队列是一种先进先出的数据结构,而栈则是一种后进先出的数据结构:(2)队列支持首尾两端的访问操作,而栈