STL—queue和stack使用及源码剖析

Posted _Karry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL—queue和stack使用及源码剖析相关的知识,希望对你有一定的参考价值。

文章目录

queue和stack概述

queuestack底层是通过deque实现的,从设计模式上来说,这两种容器本质上是deque的适配器。
这两个容器的元素进出有严格的规则,所以queuestack不支持有关迭代器的操作

queue和stack的使用

queue<int> q;
q.empty();
q.front();
q.back();
q.pop();
q.push(2);
q.size();
stack<int> s;
s.push(3);
s.pop();	//弹出栈顶元素
s.top();	//返回栈顶元素的引用
s.swap(s1);
s.empty();
s.size();

queue和stack源码剖析

容器queuestack作为deque的适配器(adapter),其内部均默认封装了一个deque作为底层容器,通过该deque执行具体操作

template<class T, class Sequence=deque<T>>
class queue 
public:
    typedef typename Sequence::value_type value_type;
    typedef typename Sequence::size_type size_type;
    typedef typename Sequence::reference reference;
    typedef typename Sequence::const_reference const_reference;
protected:
    Sequence c;     // 底层容器,默认是deque<T>
public:
    bool empty() const  return c.empty(); 
    size_type size() const  return c.size(); 
    reference front()  return c.front(); 
    const_reference front() const  return c.front(); 
    reference back()  return c.back(); 
    const_reference back() const  return c.back(); 
    void push(const value_type &x)  c.push_back(x); 
    void pop()  c.pop_front(); 
    // ...
;

template<class T, class Sequence=deque<T> >
class stack 
public:
    typedef typename Sequence::value_type value_type;
    typedef typename Sequence::size_type size_type;
    typedef typename Sequence::reference reference;
    typedef typename Sequence::const_reference const_reference;
protected:
    Sequence c;// 底层容器,默认是deque<T>
public:
    bool empty() const  return c.empty(); 
    size_type size() const  return c.size(); 
    reference top()  return c.back(); 
    const_reference top() const  return c.back(); 
    void push(const value_type &x)  c.push_back(x); 
    void pop()  c.pop_back(); 
    // ...
;

容器queuestack的元素进出是有严格规定的,因此两个容器都不允许遍历,其内部没有定义迭代器

stack<string>::iterator ite;	// 不能通过编译 error: 'iterator' is not a member of 'std::stack<std::__cxx11::basic_string<char> >'
queue<string>::iterator ite;	// 不能通过编译 error: 'iterator' is not a member of 'std::queue<std::__cxx11::basic_string<char> >'

实际上queuestack的底层容器也可以指定为list;stack的底层容器也可以指定为vector,这些底层容器均实现了queuestack内部用到的方法

queue<int, list<int>> q1;
for (long i = 0; i < 10; ++i) 
    q1.push(rand());


stack<int, list<int>> s1;
for (long i = 0; i < 10; ++i) 
    s1.push(rand());


stack<int, vector<int>> s2;
for (long i = 0; i < 10; ++i) 
    s2.push(rand());

实际上,若指定了错误的底层容器但没有调用不支持的方法的话,程序仍能够编译通过,这说明编译器在处理模板时不会做全面的检查

queue<int, vector<int>> q2;
for (long i = 0; i < 10; ++i) 
    q2.push(rand());

cout << "queue.size()= " << q2.size() << endl;
cout << "queue.front()= " << q2.front() << endl;
cout << "queue.back()= " << q2.back() << endl;
// 若注释掉下面一行,则程序能够编译通过
q2.pop();	// error: 'class std::vector<int>' has no member named 'pop_front'
cout << "queue.size()=" << q2.size() << endl;
cout << "queue.front()= " << q2.front() << endl;
cout << "queue.back()= " << q2.back() << endl;

以上是关于STL—queue和stack使用及源码剖析的主要内容,如果未能解决你的问题,请参考以下文章

《STL源码剖析》——第四章序列容器

C++初阶:STL —— stack and queuestack/queue的介绍及使用 | stack/queue/priority_queue的深度剖析及模拟实现 | 适配器模式 | 仿函数

C++初阶:STL —— stack and queuestack/queue的介绍及使用 | stack/queue/priority_queue的深度剖析及模拟实现 | 适配器模式 | 仿函数

STL源码剖析 学习笔记

STL详解—— stack和queue的介绍及使用

必读篇!STL序列式容器priority_queue源码剖析