STL之stack实现详解

STL栈介绍

stack是先进先出,没有迭代器,只允许push和pop操作以及读取和修改栈顶top元素的操作。由于stack利用了底层容器实现工作,所以称之为配接器而已。
STL之stack实现详解_第1张图片

栈的完整定义

#define __STL_NULL_TMPL_ARGS <> 
//模板传入的是一个类
template <class T, class Sequence = deque >//deque默认选择deque,并且使用alloc内存分配,缓冲区大小为512字节
class stack {
  friend bool operator== __STL_NULL_TMPL_ARGS (const stack&, const stack&);//声明友元
  friend bool operator< __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;//定义一个deque对象
public:
  bool empty() const { return c.empty(); }
  size_type size() const { return c.size(); }
  reference top() { return c.back(); }//返回栈顶元素的引用,可以读也可以写。
  const_reference top() const { return c.back(); }
  void push(const value_type& x) { c.push_back(x); }//压栈
  void pop() { c.pop_back(); }//出栈
};

template <class T, class Sequence>
bool operator==(const stack& x, const stack& y) {//定义友元
  return x.c == y.c;
}

template <class T, class Sequence>
bool operator<(const stack& x, const stack& y) {//定义友元
  return x.c < y.c;
}//至于为什么这里需要用友元,可以参考effective c++

有两种形式可以使用这个栈。T是栈存储数据的类型,deque是类。用来在栈里面实现对应的操作。所以栈可以传入类型和对应的底层容器类,使用起来很方便。
至于为什么需要有友元函数,参考effective c++

int main(void)
{
    stack<int> x;
    stack<int> y;
    stack<char> z;//这三个使用deque作为栈
    stack<int , list<int>> zz;//以list类作为底层的数据结构,这就是栈的用法,很牛逼的。
std::cout << (x == y) << endl;//调用友元函数
std::cout << (x > y) << endl;//调用友元函数 

std::cout << (x > z) << endl;//没有匹配函数,错误。 
}

栈没有啥说的,就是将底层的容器封装了下,非常容易理解。就是这么简单哦

你可能感兴趣的:(C,PlusPlus,STL源代码剖析)