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(1);
    mystack.push(3);
    mystack.push(6);
    mystack.push(7);
    mystack.push(2);

    cout << mystack.size() << endl;     // 5
    cout << mystack.top() << endl;      // 2

    mystack.pop();
    cout << mystack.top() << endl;      // 7
    mystack.pop();
    cout << mystack.top() << endl;      // 6
    mystack.pop();
    cout << mystack.top() << endl;      // 3

    cout << mystack.size() << endl;     // 2

    return 0;
}

  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(1);
    myque.push(3);
    myque.push(6);
    myque.push(7);
    myque.push(2);

    cout << myque.size() << endl;       // 5
    cout << myque.front() << endl;      // 1

    myque.pop();
    cout << myque.front() << endl;      // 3
    myque.pop();
    cout << myque.front() << endl;      // 6
    myque.pop();
    cout << myque.front() << endl;      // 7

    cout << myque.size() << endl;       // 2

    return 0;
}

  特别注意,由于stack,queue的特性,它们没有迭代器。

时间: 2024-10-29 01:04:19

STL容器适配器 stack, queue的相关文章

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

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

STL 笔记(三) 容器适配器 stack、queue、priority_queue

栈 stack 栈 stack 是一种先进后出的(First In Last Out, FILO)的数据结构.在 STL中,stack 底层容器默认使用的是deque, 也可以自己指定用 vector 或 list 容器,然后将其接口适配为栈的接口.部分源代码: // stack source code (部分) template <class _Tp, class _Sequence __STL_DEPENDENT_DEFAULT_TMPL(deque<_Tp>) > class

容器适配器————stack

只能访问 stack 顶部的元素:只有在移除 stack 顶部的元素后,才能访问下方的元素. 堆栈操作 top():返回一个栈顶元素的引用,类型为 T&.如果栈为空,返回值未定义. push(const T& obj):可以将对象副本压入栈顶.这是通过调用底层容器的 push_back() 函数完成的. push(T&& obj):以移动对象的方式将对象压入栈顶.这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的. pop():弹出栈顶元素. siz

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创建了一个排序队列,内部用二叉堆实

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

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

STL--容器适配器(queue、priority_queue、stack)

适配器(Adaptor)是提供接口映射的模板类.适配器基于其他类来实现新的功能,成员函数可以被添加.隐藏,也可合并以得到新的功能. STL提供了三个容器适配器:queue.priority_queue.stack. 这些适配器都是包装了vector.list.deque中某个顺序容器的包装器.注意:适配器没有提供迭代器,也不能同时插入或删除多个元素. 本文地址:http://www.cnblogs.com/archimedes/p/cpp-adapter.html,转载请注明源地址. 队列(qu

初探STL之容器适配器

容器适配器 特点 用某种顺序容器来实现(让已有的顺序容器以栈/队列的方式工作) 分类 1) stack: 头文件 <stack> ? 栈 -- 后进先出 2) queue: 头文件 <queue> ? 队列 -- 先进先出 3) priority_queue: 头文件 <queue> ? 优先级队列 -- 最高优先级元素总是第一个出列 注: 容器适配器上没有迭代器 STL中各种排序, 查找, 变序等算法都不适合容器适配器 Stack 特点 1.stack 是后进先出的数

STL容器及适配器

STL容器   1.序列式容器 : vector,deque,list. 每个元素都有固定的位置(取决于插入的时机和位置,与元素值无关). vector 特点: 将一个元素置于一个动态数组中加以管理,可以随机存取元素.在数组尾部添加或删除元素非常快速,但是在中部或头部插入或删除元素比较耗时. deque "double-ended queue" 双端队列,可以随机存取.数组尾部或头部添加或删除元素非常快速,但在中部插入或删除元素比较费时.实际上,deque 是对vector 和list

初步STL该容器适配器

容器适配器 特点 容器一定的顺序来实现(让现有的以集装箱堆放/式工作) 分类 1) stack: 头文件 <stack> ? 栈 -- 后进先出 2) queue: 头文件 <queue> ? 队列 -- 先进先出 3) priority_queue: 头文件 <queue> ? 优先级队列 -- 最高优先级元素总是第一个出列 注: 容器适配器上没有迭代器 STL中各种排序, 查找, 变序等算法都不适合容器适配器 Stack 特点 1.stack 是后进先出的数据结构