《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;
}
#读书笔记##笔记#
全部评论

相关推荐

码农索隆:有点耳熟,你们是我教过最差的一届
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-04 14:35
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务