1. 程式人生 > >STL原始碼剖析(四)容器介面卡--stack、queue

STL原始碼剖析(四)容器介面卡--stack、queue

文章目錄

1. 寫在前面

容器介面卡:具有”修改某物介面,形成另一種風貌“之性質者,稱為adapter,而又以容器作為其底層,故稱之為container adapter

  • 容器介面卡有3種,分別是stack、queue以及priority_queue,而priority_queue又以heap作為其操作實現,所以等下一節解析heap時放於其中解析,在這裡只分析stack以及queue

2. stack–queue

2.1 satck概述

2.1.1 stack實現

  • 首先,stack即棧,是一種先進後出的資料結構,只有一個出口,只能從頂端對元素進行操作,在資料結構課程中有所瞭解;而STL中將stack作為一種配接器,以deque或list作為其底層容器實現其功能
  • 原始碼如下:
template <class T, class Sequence = deque<T>>    //此處deque也可更換成list
class stack {
	//兩個友元函式,實現兩個stack的比較操作
	friend bool operator==
__STL_NULL_TMPL_ARGS (const stack&, const stack&); friend bool oeprator<__STL_NULL_TMPL_ARGS (const stack&, const stack&); 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; public: //利用Sequence的操作完成stack的操作 bool empty() const { return c.empty(); } size_type size() const { return c.size(); } reference top() { rerturn c.back(); } const_reference top() const { return c.back(); } //stack後進者先出 void push(const value_type& x) { c.push_back(x); } void pop() { return c.pop_back(); } }; template <class T, class Sequence> bool operator== (const stack<T, Sequence>& x, const stack<T, Sequence>& y) { return x.c == y.c; } template <class T, class Sequence> bool operator== (const stack<T, Sequence>& x, const stack<T, Sequence>& y) { return x.c < y.c; }

2.1.2 stack迭代器

  • stack所有元素都必須符合”先進後出“的條件,只有頂端元素才能被訪問,stack不提供走訪功能,所以沒有迭代器

2.2 queue概述

2.2.1 queue實現

  • queue即佇列,是一種先進先出的資料結構,有兩個出口,只能從最底端或最頂端對元素進行操作;在STL中將queue作為一種配接器,以deque或list作為其底層容器實現其功能
  • 原始碼如下(與stack基本類似):
template <class T, class Sequence = deque<T>>    //此處deque也可更換成list
class queue {
	//兩個友元函式,實現兩個stack的比較操作
	friend bool operator==__STL_NULL_TMPL_ARGS (const queue&, const queue&);
	friend bool oeprator<__STL_NULL_TMPL_ARGS (const queue&, const queue&);
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;
public:
	//利用Sequence的操作完成queue的操作
	bool empty() const { return c.empty();  }
	size_type size()  const { return c.size(); }
	reference front()  { rerturn c.front(); }
	const_reference front() const { return c.front(); }
	reference back()  { rerturn c.back(); }
	const_reference back() const { return c.back(); }
	//queue先進者先出
	void push(const value_type& x)  { c.push_back(x); }
	void pop()  { return 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;
}

2.2.2 queue迭代器

  • queue所有元素都必須符合”先進先出“的條件,只有頂端元素才能被訪問,queue不提供走訪功能,所以沒有迭代器