1. 程式人生 > 其它 >SGI STL佇列queue

SGI STL佇列queue

目錄

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;
}