STL容器适配器 stack, queue
stack是一种后进先出(last in first out)的数据结构。它只有一个出口,如图所示。stack允许新增元素,删除元素,取得最顶端元素。但除了最顶端外,没有其他任何地方可以存储stack的其他元素,换言之,stack不允许有遍历行为。
将元素推入stack的操作称为push, 将元素推出stack的操作称为pop.
为什么将stack称为适配器呢?我们先来看看适配器是怎么定义的。具有这种“修改某物接口,形成另一种风貌”之性质者,称为adapter(适配器)。换言之,由于stack的性质,可以使用vector或deque或list为底部结构进行一定的修改,轻易形成一个stack.
来看看stack的模板声明:
template<class T, class Sequence = deque<T>> class stack { // … protected: Sequeue c; //底层容器 public: bool empty() const { return c.empty(); } size_type size() const { return c.size(); } reference top() { return c.back(); } const_reference top() { return c.back(); } void push(const value_type& x) { c.push_back(x); } void pop() { c.pop_back(); } };
stack有2个模板参数,第二个Sequence(底层容器)默认的为deque。当然如果我们需要使用vector或list的话,必须自己指定出来。
测试代码:
#include <stack> #include <list> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { // stack<int, vector<int>> mystack; // 底层容器使用vector // stack<int, deque<int>> mystack; // 底层容器使用deque (默认情况下) stack<int, list<int>> mystack; // 底层容器使用list mystack.push(); mystack.push(); mystack.push(); mystack.push(); mystack.push(); cout << mystack.size() << endl; cout << mystack.top() << endl; mystack.pop(); cout << mystack.top() << endl; mystack.pop(); cout << mystack.top() << endl; mystack.pop(); cout << mystack.top() << endl; cout << mystack.size() << endl; ; }
queue(队列)是一种先进先出(first in first out)的数据结构。他有两个端口,如下图所示。queue允许新增元素,删除元素,从最底端加入元素,取得最顶端元素等,但除了最底端可以加入,最顶端可以取出外,没有任何其他方法可以存取queue的其他元素。换言之,queue不允许有遍历行为。
将元素推入queue的操作称为push, 将元素推出queue的操作称为pop.
来看看queue的模板声明:
template<class T, class Sequence = deque<T>> class queue { // … protected: Sequeue c; //底层容器 public: bool empty() const { return c.empty(); } size_type size() const { return c.size(); } reference front() { return c.front(); } const_reference front() { return c.front(); } reference back() { return c.back(); } const_reference back() { return c.back(); } void push(const value_type& x) { c.push_back(x); } void pop() {c.pop_front(); } };
由于queue的结构性质,无法使用vector作为其底层容器(由于效率问题,vector类并未定义相关front函数),我们可以使用deque(默认)和list作为它的底层容器。
测试代码:
#include <queue> #include <list> #include <iostream> #include <algorithm> using namespace std; int main() { // queue<int, deque<int>> myque; // 使用deque作为底层容器(默认) queue<int, list<int>> myque; // 使用list作为底层容器 myque.push(); myque.push(); myque.push(); myque.push(); myque.push(); cout << myque.size() << endl; cout << myque.front() << endl; myque.pop(); cout << myque.front() << endl; myque.pop(); cout << myque.front() << endl; myque.pop(); cout << myque.front() << endl; cout << myque.size() << endl; ; }
特别注意,由于stack,queue的特性,它们没有迭代器。
STL容器适配器 stack, queue的更多相关文章
- STL容器(Stack, Queue, List, Vector, Deque, Priority_Queue, Map, Pair, Set, Multiset, Multimap)
一.Stack(栈) 这个没啥好说的,就是后进先出的一个容器. 基本操作有: stack<int>q; q.push(); //入栈 q.pop(); //出栈 q.top(); //返回 ...
- STL之容器适配器stack的实现框架
说明:本文仅供学习交流,转载请标明出处,欢迎转载! 一提到适配器(adapter).我们就想到了早期用电话线上网所用的调制解调器,俗称"猫"."猫"的作用是实现 ...
- 容器适配器(一):queue
除了标准的顺序容器外,STL还提供了3种容器适配器,queue,priority_queue和stack 适配器是对顺序容器的包装,它的作用是简化接口. queue接口十分的简单,只有8个方法.再加上 ...
- c++ STL容器适配器
一.标准库顺序容器适配器的种类 标准库提供了三种顺序容器适配器:queue(FIFO队列).priority_queue(优先级队列).stack(栈) 二.什么是容器适配器 &q ...
- STL源码剖析——序列式容器#4 Stack & Queue
Stack stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,元素的新增.删除.最顶端访问都在该出口进行,没有其他位置和方法可以存取stack的元素. ...
- 容器适配器————stack
只能访问 stack 顶部的元素:只有在移除 stack 顶部的元素后,才能访问下方的元素. 堆栈操作 top():返回一个栈顶元素的引用,类型为 T&.如果栈为空,返回值未定义. push( ...
- STL容器分析--stack
stack,顾名思义,表示栈,先进后出.
- 容器适配器(stack、 queue 、priority_queue)源码浅析与使用示例
一.容器适配器 stack queue priority_queue stack.queue.priority_queue 都不支持任一种迭代器,它们都是容器适配器类型,stack是用vector/d ...
- Stack&&Queue
特殊的容器:容器适配器 stack queue priority_queue:vector+堆算法---->优先级队列 stack: 1.栈的概念:特殊的线性结构,只允许 ...
随机推荐
- 实验1_IPv6地址配置
IPv6地址配置 实验任务 (1)掌握如何在路由器及PC上配置IPv6地址 (2)掌握如何用IPv6 ping命令进行IPv6地址可达性检查 (3)掌握如何用命令来查看IPv6地址配置 实验过程 在R ...
- [Thinking in Java]Nothing but Java
1 对象(Double Elephants) 1.1 抽象 万物皆对象.什么东西都可以抽象成属性和方法,达到可重用的目的. 对象之间交流靠发送消息.就是通过调用某个特定对象的方法来达到消息传递的目的. ...
- Http中 Post和 Get的区别
1.表面上的区别 1.GET在浏览器回退时,是无害的,而Post会再次提交请求 2.Get产生的Url地址会被Bookmark,而Post不会 3.Get请求会被浏览器主动Cache,而Post不会, ...
- (转) Deep Learning Resources
转自:http://www.jeremydjacksonphd.com/category/deep-learning/ Deep Learning Resources Posted on May 13 ...
- 线程安全及Python中的GIL
线程安全及Python中的GIL 本博客所有内容采用 Creative Commons Licenses 许可使用. 引用本内容时,请保留 朱涛, 出处 ,并且 非商业 . 点击 订阅 来订阅本博客. ...
- gzip压缩及测试方法【转载】
Nginx开启Gzip压缩大幅提高页面加载速度 http://www.veryhuo.com/a/view/51706.html 刚刚给博客加了一个500px相册插件,lightbox引入了很多js文 ...
- 针对web高并发量的处理
针对web高并发量的处理 针对高并发量的处理 一个老生常谈的话题了 至于需要运维支持的那些cdn.负载均衡神马的就不赘述了 你们都懂的 虫子在此博文只讲一些从程序角度出发的一些不错的解决方案. 至于从 ...
- 怎样让SoapHttpClientProtocol不使用系统默认代理
方法很简单,但找起来很难. 使用SoapHttpClientProtocol类的Proxy属性. 不能设空值,必须设一个新值. 赶脚底层在链接的时候会判断这个属性是不是null,如果null就会用默认 ...
- Beta版本冲刺——day5
No Bug 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 站立式会议 今日计划表 人员 工作 ...
- TFS下的源代码控制
以下主要描述了: TFS源代码控制系统的基本场景 如何把一个项目添加到源代码管理中 如何与服务器同步 如何做Check-In 如何做分支与合并 什么是上架与下架 我们知道工作项是项目管理的基本元素,但 ...