SGISTL原始碼閱讀十八 queue(佇列)
阿新 • • 發佈:2018-11-14
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
這兩個資料結構,並且從原始碼的角度上去分析它們。瞭解到這是兩個使用了底層容器的配接器,簡單呼叫了底層容器的方法來實現了另外一種資料結構。