从零开始,打造自己的STL(六、stack)

前面一章中介绍了deque,除了 C++11 标准中的 array 和 forward_list 之外,序列式容器就已经全部介绍完了,这一部分开始就准备介绍容器适配器。容器适配器相较于容器来说,更加的简单。因为容器适配器里面所有的接口都是对容器内部方法的调用。可以把他们之间的关系当成组合关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
template<typename _Tp, typename _Sequence=deque<_Tp> >
class stack
{
public:
typedef typename _Sequence::value_type value_type;
typedef typename _Sequence::size_type size_type;

typedef _Sequence container_type;
typedef typename _Sequence::reference reference;
typedef typename _Sequence::const_reference const_reference;

protected:
_Sequence c;

public:
stack() :c() {}
stack(const _Sequence &_s) :c(_s) {}
bool empty()const
{
return c.empty();
}

size_type size()const
{
return c.size();
}

reference top()
{
return c.back();
}

void push(const value_type& _val)
{
c.push_back(_val);
}

void pop()
{
c.pop_back();
}
};

代码可以说再简单不过了,通过模板参数 _Sequence 可以决定使用哪个容器来作为栈的接口,在这里,默认使用的是deque,其实,只要是实现了empty, size, back, push_back, pop_back的容器,在这里都可以使用。只是使用不同的容器所带来的性能会有所不同。