SGISTL源码阅读十八 queue(队列)
前言
和上一篇文章提到过的stack
一样,queue
也是一种配接器(adapter),它们的实现非常类似。
它是一种(First In First Out,FIFO)的数据结构,也没有提供遍历或指定位置访问等操作,只能从末端添加元素,顶部取出元素,所以它也没有迭代器。
深入源码
queue
的定义部分
#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
//缺省使用deque作为底层容器
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:
//底层容器
Sequence c;
queue
操作符重载
//重载==
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;
}
queue
提供的接口
queue
所提供的接口也是完全利用了底层容器c来完成操作,调用了c的函数。
public:
//判断queue是否为空
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(); }
//将元素x入队列
void push(const value_type& x) { c.push_back(x); }
//将顶部元素取出队列
void pop() { c.pop_front(); }
queue
的简单使用
#include <iostream>
#include <queue>
using namespace std;
int main()
{
//缺省使用deque作为底层容器
queue<int> myqueue;
myqueue.push(0);
myqueue.push(5);
myqueue.push(2);
myqueue.push(6);
cout << "size:" << myqueue.size() << endl;
cout << "front element:" << myqueue.front() << endl;
cout << "back element:" << myqueue.back() << endl;
myqueue.pop();
cout << "front element:" << myqueue.front() << endl;
cout << "back element:" << myqueue.back() << endl;
myqueue.pop();
cout << "front element:" << myqueue.front() << endl;
cout << "back element:" << myqueue.back() << endl;
myqueue.pop();
cout << "front element:" << myqueue.front() << endl;
cout << "back element:" << myqueue.back() << endl;
myqueue.pop();
cout << "size:" << myqueue.size() << endl;
return 0;
}
#include <iostream>
#include <queue>
#include <list>
using namespace std;
int main()
{
//queue<int> myqueue;
//指定list作为它的底层容器
queue<int, list<int> > myqueue;
myqueue.push(0);
myqueue.push(5);
myqueue.push(2);
myqueue.push(6);
cout << "size:" << myqueue.size() << endl;
cout << "front element:" << myqueue.front() << endl;
cout << "back element:" << myqueue.back() << endl;
myqueue.pop();
cout << "front element:" << myqueue.front() << endl;
cout << "back element:" << myqueue.back() << endl;
myqueue.pop();
cout << "front element:" << myqueue.front() << endl;
cout << "back element:" << myqueue.back() << endl;
myqueue.pop();
cout << "front element:" << myqueue.front() << endl;
cout << "back element:" << myqueue.back() << endl;
myqueue.pop();
cout << "size:" << myqueue.size() << endl;
return 0;
}
总结
我们其实算是温故了一下stack
和queue
这两个数据结构,并且从源码的角度上去分析它们。了解到这是两个使用了底层容器的配接器,简单调用了底层容器的方法来实现了另外一种数据结构。