SGI STL佇列queue
阿新 • • 發佈:2022-05-08
目錄
queue簡介
佇列queue是一種先進先出(FIFO)的資料結構。有2個出口:允許從頭部移除、查詢元素,從尾部加入元素。除此之外,無法存取其他位置元素,也不允許遍歷。
將元素推入queue的操作稱為push,將元素推出queue的從中稱為pop。
queue的資料結構
類似於stack,queue也是依賴於底層容器實現其操作,以滿足FIFO特性。queue往往被稱為container adapter,而不稱為container。SGI STL中,queue預設底層容器是deque。
# define __STL_DEPENDENT_DEFAULT_TMPL(_Tp) = _Tp // stack底層容器預設是deque template <class _Tp, class _Sequence __STL_DEPENDENT_DEFAULT_TMPL(deque<_Tp>) > class queue { // __STD_QUALIFIER展開為std::, __STL_NULL_TMPL_ARGS展開為<> friend bool __STD_QUALIFIER operator== __STL_NULL_TMPL_ARGS (const queue&, const queue&); friend bool __STD_QUALIFIER operator< __STL_NULL_TMPL_ARGS (const queue&, const queue&); public: // 定義內嵌型別 typedef typename _Sequence::value_type value_type; typedef typename _Sequence::size_type size_type; typedef _Sequence container_type; typedef typename _Sequence::reference reference; typedef typename _Sequence::const_reference const_reference; protected: _Sequence c; // 底層容器 public: queue() : c() {} explicit queue(const _Sequence& __c) : c(__c) {} // 以下利用Sequence c的操作, 完成queue的操作 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(); } // deque 雙端可進出, queue只支援尾端進, 首端出, 以支援FIFO void push(const value_type& __x) { c.push_back(__x); } void pop() { c.pop_front(); } }; // 比較兩個queue x, y的所有元素是否相等 template <class _Tp, class _Sequence> bool operator==(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y) { return __x.c == __y.c; } // 比較queue x是否小於stack y template <class _Tp, class _Sequence> bool operator<(const queue<_Tp, _Sequence>& __x, const queue<_Tp, _Sequence>& __y) { return __x.c < __y.c; }
queue沒有迭代器
queue所有元素必須符合“先進先出”的規則,只有隊頭元素才能被外界訪問,只有隊尾才能插入資料。queue不提供遍歷功能,也不提供迭代器。
以list作為queue底層容器
除了deque,list也是雙向開口的容器,也能作為queue的底層容器。queue要求底層容器支援empty(),size(),back(),push_back(),pop_back()等介面。
以list作為queue底層容器示例:
int main() { queue<int, list<int>> iqueue; iqueue.push(1); iqueue.push(3); iqueue.push(5); iqueue.push(7); cout << iqueue.size() << endl; // 4 cout << iqueue.front() << endl; // 1 iqueue.pop(); cout << iqueue.front() << endl; // 3 iqueue.pop(); cout << iqueue.front() << endl; // 5 iqueue.pop(); cout << iqueue.front() << endl; // 7 cout << iqueue.size() << endl; // 1 return 0; }