STL—queue和stack使用及源码剖析
Posted _Karry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL—queue和stack使用及源码剖析相关的知识,希望对你有一定的参考价值。
文章目录
queue和stack概述
queue
和stack
底层是通过deque
实现的,从设计模式上来说,这两种容器本质上是deque
的适配器。
这两个容器的元素进出有严格的规则,所以queue
和stack
不支持有关迭代器的操作
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源码剖析
容器queue
和stack
作为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();
// ...
;
容器queue
和stack
的元素进出是有严格规定的,因此两个容器都不允许遍历,其内部没有定义迭代器
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> >'
实际上queue
和stack
的底层容器也可以指定为list
;stack
的底层容器也可以指定为vector
,这些底层容器均实现了queue
和stack
内部用到的方法
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使用及源码剖析的主要内容,如果未能解决你的问题,请参考以下文章
C++初阶:STL —— stack and queuestack/queue的介绍及使用 | stack/queue/priority_queue的深度剖析及模拟实现 | 适配器模式 | 仿函数
C++初阶:STL —— stack and queuestack/queue的介绍及使用 | stack/queue/priority_queue的深度剖析及模拟实现 | 适配器模式 | 仿函数