STL原始碼分析之queue配接器
阿新 • • 發佈:2018-12-08
前言
上一節分析了stack
實現, stack
是修改了deque
的介面而實現的一個功能簡單的結構, 本節分析的queue
也是用deque
為底層容器封裝.
queue
資料都是在頭部進行操作的, 之允許進行push和pop操作.
queue分析
queue結構
#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
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;
public:
bool empty() const { return c.empty(); }
size_type size() const { return c.size(); }
// 呼叫deque的front函式
reference front() { return c.front(); }
const_reference front () const { return c.front(); }
reference back() { return c.back(); }
const_reference back() const { return c.back(); }
// 只封裝push_back, pop_front函式
void push(const value_type& x) { c.push_back(x); }
void pop() { 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;
}
queue例項
int main()
{
std::queue<int> qu;
qu.push(1);
qu.push(2);
qu.push(3);
qu.size();
while(!qu.empty())
{
std::cout << qu.front() << " "; // 1 2 3
qu.pop();
}
exit(0);
}
總結
queue
與stack
都是使用底層介面封裝的結構, 他們是被稱為配接器而不是容器.