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;