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.栈的概念:特殊的线性结构,只允许 ...
随机推荐
- UART
一.协议部分: 协议部分转自:http://www.s8052.com/index.htm 串行通信的传送方向通常有三种: 1.为单工,只允许数据向一个方向传送: 2.半双工,允许数据向两个方向中的任 ...
- Lua简介
Lua是一种扩展语言,脚本语言,还没有主程序的概念,类似于插件,也即不能直接使用,必须嵌入在牛逼的语言里使用,如Python. Lua由C语言编写,可以在宿主语言里写一段c程序,让Lua的解释器使用, ...
- 经验分享:Linux 双网卡SNAT和DNAT映射本地端口出外网
A 机器 网卡1 公网IP网卡2 内网 B 机器网卡1 内网 如果想把公网端口P1 映射为内网B机器端口P2 iptables -t nat -A PREROUTING -d [A公网地址] -p ...
- Python3.5 用 pip 安装lxml时出现 “Unable to find vcvarsall.bat ”?(转载)
来自:https://www.zhihu.com/question/26857761 解决步骤: 1. 安装wheel,命令行运行: pip install wheel 2.在这里下载对应的.whl文 ...
- spring 4 @RestController 小试
在建立好基本的spring框架后,可以尝试实现一下简单的rest风格请求 1.需要引入的包,部分pom.xml文件 <dependency> <groupId>org.code ...
- JAVA访问权限
同一个类 同一个包 不同包的子类 不同包的非子类 Private √ Default √ √ Protected √ √ √ Public √ √ √ √
- 数据绑定时(<%#Eval)单引号双引号嵌套问题
期望得到的HTML如下: onclick='edit("10000001")' 或者 onclick="edit('10000001')" 实际ASP.NET前 ...
- 协程、异步IO
协程,又称微线程,纤程.英文名Coroutine,协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器 ...
- 关于Maven的一些记录
Eclipse-Mars4.5自带Maven插件,自己重新下载之后将不兼容. 可以在图中位置设置jar包路径. 可以在Eclipse新建Dynamic Web Project项目,然后在项目上右键=& ...
- Github使用指南-从新手到专家
转载自:http://www.cnblogs.com/xirongliu/p/4589834.html 个人从刚刚开始接触github,啥都不知道,不会用,不知道能够用来干什么,到现在坚持在githu ...