前言
在本小节中,我们将分析queue
,即队列,这种数据结构的元素符合先进先出(FIFO)的条件。它同stack
一样,不算是一种容器,而是采用一种容器(SGISTL中默认是deque
)作为底层结构并修改部分接口为自己所用的配接器。queue
同stack
一样,不支持元素的遍历操作,因此并不需要迭代器。它的所有接口都依靠底层的容器实现。
queue
源码
定义部分
#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
template <class T, class Sequence = deque<T> >
#else
template <class T, class Sequence>
#endif
class queue {
//重载操作符函数的定义
friend bool operator== __STL_NULL_TMPL_ARGS (const queue& x, const queue& y);
friend bool operator< __STL_NULL_TMPL_ARGS (const queue& x, const queue& y);
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:
//定义deque容器
Sequence c;
queue提供的接口
public:
//判空
bool empty() const { return c.empty(); }
//queue的大小
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>
bool operator==(const queue<T, Sequence>& x, const queue<T, Sequence>& y) {
return x.c == y.c;
}
template <class T, class Sequence>
bool operator<(const queue<T, Sequence>& x, const queue<T, Sequence>& y) {
return x.c < y.c;
}
例子
#include <iostream>
#include <queue>
//#include <list>
//#include <vector>
using namespace std;
int main()
{
queue<int> que;
/* 可以指定采取其他容器作为底层结构,如
* queue<int, list<int> > que;
* queue<int, vector<int> > que;
*/
que.push(1);
que.push(2);
que.push(3);
cout << "size " << que.size() << endl;
cout << "队首 " << que.front() << endl;
que.pop();
cout << "size " << que.size() << endl;
cout << "队首 " << que.front() << endl;
que.pop();
cout << "size " << que.size() << endl;
cout << "队首 " << que.front() << endl;
que.pop();
if(que.empty())
cout << "empty queue" << endl;
return 0;
}
小结
本小节介绍了queue
的实现,它和stack
特别类似,也是没有自己迭代器,以及都是配接器,它们的实现都很简单,因为依靠了复杂的容器作为底部结构。
而在stl_queue.h
中,还实现了priority_queue
(优先级队列),它的实现也很简单,在分析它之前,我们要先对heap
进行分析,它作为priority_queue
的辅助,提供了满足优先级队列出队的操作等。