SGISTL源码探究-stack配接器
来源:互联网 发布:ubuntu 16.04 安装出错 编辑:程序博客网 时间:2024/06/15 13:09
前言
迄今为止,我们已经分析了vector
、list
、deque
容器,而stack
并不是一个容器,它是依据一种容器作为底层结构,然后根据自己的要求改变容器提供的接口。而在SGISTL的实现中,stack
默认是以deque
为底部结构,并且封装了一些接口并且stack
中没有迭代器,它也并不需要,因为栈这种结构,并不支持遍历等操作,而出栈入栈这些操作,直接使用deque
提供的操作,然后自己封装一下就行了。
由于它的源码比较简单,我们直接贴出代码进行分析就行了。
stack源码
stack定义部分
template <class T, class Sequence = deque<T> >#elsetemplate <class T, class Sequence>#endifclass 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: //底层的容器,即deque Sequence c;
stack提供的接口
public: //使用deque提供的empty bool empty() const { return c.empty(); } //使用deque提供的size size_type size() const { return c.size(); } //访问栈顶元素,即deque的最后一个元素 reference top() { return c.back(); } const_reference top() const { return c.back(); } //压入栈,使用push_back即可 void push(const value_type& x) { c.push_back(x); } //弹出栈,使用pop_back void pop() { 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;}
例子
#include <iostream>#include <stack>//#include <list>//#include <vector>using namespace std;int main(){ stack<int> st; /* 可以指定采取其他容器作为底层结构,如 * stack<int, list<int> > st; * stack<int, vector<int> > st; */ st.push(1); st.push(2); st.push(3); cout << "size " << st.size() << endl; cout << "top " << st.top() << endl; st.pop(); cout << "size " << st.size() << endl; cout << "top " << st.top() << endl; st.pop(); cout << "size " << st.size() << endl; cout << "top " << st.top() << endl; st.pop(); if(st.empty()) cout << "empty stack" << endl; return 0;}### __小结__
本小节介绍了stack
是如何实现的,如果之前没有了解过stack
源码,肯定会对它的实现感到惊讶。因为它仅仅就只是利用了容器的实现,然后自己封装一些接口就完事了,它并不是容器,而是一种配接器,即修改某物的接口,供自己使用。
下一小节中,我们将介绍queue
,它也是一种配接器,而不是容器。
阅读全文
0 0
- SGISTL源码探究-stack配接器
- SGISTL源码探究-配接器
- SGISTL源码探究-queue配接器
- SGISTL源码探究-内存池
- SGISTL源码探究-traits技法
- SGISTL源码探究-大根堆heap
- SGISTL源码探究-优先级队列
- SGISTL源码探究-仿函数
- SGISTL源码探究-空间配置器
- SGISTL源码探究-第一级配置器
- SGISTL源码探究-第二级配置器
- SGISTL源码探究-迭代器的类型
- SGISTL源码探究-vector容器(上)
- SGISTL源码探究-vector容器(下)
- SGISTL源码探究-list容器(上)
- SGISTL源码探究-list容器(下)
- SGISTL源码探究-deque容器(上)
- SGISTL源码探究-deque容器(下)
- 开启MySQL performance_schema后对性能的影响
- 搭建ELK(ElasticSearch+Logstash+Kibana)日志分析系统(六) ElasticSearch demo演示
- 【Gradle Build Tool 4.1用户指南】Chapter 3. Installing Gradle 第三章、安装Gradle
- 基于NCO3.0的SapRfcFunction测试工具开发之一
- 争取实现自己的小目标:向Siki老师要一张签名照 (17.09.14)
- SGISTL源码探究-stack配接器
- Web 开发模式演变历史和趋势
- 图像颜色增强算法Opencv
- Scout YYF I POJ
- 简单模拟和电脑比赛摇甩子js
- 前端工程师如何与设计师合作
- numpy Broadcasting
- 会话cookie中缺少HttpOnly属性
- Unity shader 双面 + alpha 且正常受光