《STL源码剖析》Stack
令人会产生疑问的语法形式
__STL_NULL_TMPL_ARGS
这个组态往往用在 class template 的 friend 函数声明中.
例如 stack 源码中:
template > class stack { friend bool operator== __STL_NULL_TMPL_ARGS (const stack&,const stack&); friend bool operator< __STL_NULL_TMPL_ARGS (const stack&,const stack&); }
这个展开之后等价于
template > class stack { friend bool operator== (const stack&,const stack&); friend bool operator (const stack&,const stack&); }
上述的写法也就是相当于声明了模版实参表为空.
这是因为当模板函数被声明为类模板的友元且定义在类模板之外时,在函数名之后必须紧跟模板实参表,用来代表该友元声明指向函数模板的实例。否则友元函数会被解释为一个非模板函数,链接时无法解析。
当然友元模板函数的模板参数类型,并不一定要求是类模板的参数类型,也可以另外声明。
stack概述
stack是一种FILO的数据结构.允许新增元素,删除元素,取得顶端元素.但是只有一端可以操作,也就是只能从栈顶删除或增加或获取元素.因此stack不允许有遍历行为.
stack源码
SGI STL是以deque为底层实现的stack
template > class stack { friend bool operator== (const stack&,const stack&); friend bool operator (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: bool empty() { return c.empty(); } size_type size() const { return c.size(); } reference top() { return c.back(); } const_reference top() { return c.back(); } void push(const value_type& x) { c.push_back(); }; void pop() { c.pop_back(); }; }; template bool operator==(const stack& x, const stack& y) { return x.c == y.c; } template bool operator& x, const stack& y) { return x.c < y.c; }#读书笔记##笔记#