STL原始碼剖析(四)容器介面卡--stack、queue
阿新 • • 發佈:2018-12-03
文章目錄
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不提供走訪功能,所以沒有迭代器