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不提供走访功能,所以没有迭代器

猜你喜欢

转载自blog.csdn.net/qq_38790716/article/details/84453222