STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器
- Stack是一种先进后出的数据结构,他只有一个出口
- stack允许 新增元素、移除元素、取得最顶端的元素,但是无法获得stack的内部数据,因此satck没有遍历行为
Stack定义的完整列表 (双端队列作为Stack的底层容器)
- 将deque作为Stack的底部结构,对其原有的接口进行适配,使其满足"先进后出"的特性
- deque是双向开口的数据结构,只需要封闭deque的头端开口(缺省实现),便轻而易举的形成了一个stack。
- Stack基于deque,这种“修改某物的接口 形成另外一种事物的”的性质归结为 adapter (配接器),因此将stack不归类为容器,而将其归结为 container adapter (容器适配器)
- 先前自己写的 STL版的 deque 缺失的代码比较多,因此下面的代码中 class Sequence = std::deque<T> 借用STL标准库的deque实现
//定义在stl_config.h文件中
//但是没有找到 具体详情参见 参考链接
# ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
# define __STL_NULL_TMPL_ARGS <>
# else
# define __STL_NULL_TMPL_ARGS
# endiftemplate <class T,class Sequence = std::deque<T>>
class stack{//__STL_NULL_TMPL_ARGS会展开为 <> 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;
public://以下完全使用Sequence c的操作,完成stack的操作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();}//deque 是两头可以进出,stack是末端进,末端出 (所以后进者先出)void push(const value_type& x){ c.push_back(x);}void pop(){return 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;
}
Stack没有迭代器
- 考虑到只有stack的顶端的元素才会被外界取用,因此 stack不需要提供遍历元素的迭代器
基于底层容器链表list的Stack
- Stack需要的函数如 empty、size()、back、push_back、pop_back是链表也支持的
- 使用范例
#include <stack>
#include <list>
#include <iostream>
#include <algorithm>int main(){std::stack<int,std::list<int>>list_stack;list_stack.push(1);list_stack.push(3);list_stack.push(5);list_stack.push(7);std::cout << list_stack.size() << std::endl; //4std::cout << list_stack.top() << std::endl; //7list_stack.pop();std::cout << list_stack.top() << std::endl; //5list_stack.pop();std::cout << list_stack.top() << std::endl; //3list_stack.pop();std::cout << list_stack.top() << std::endl; //1std::cout << list_stack.size() << std::endl; //1
}
参考链接
- 【c++从菜鸡到王者】第六篇:详解晦涩难懂的c++语法_Sefr后端-CSDN博客
- SGI STL-----__STL_NULL_TMPL_ARGS_yde的博客-CSDN博客
- 《STL源码剖析》-- stl_config.h_一个人的战争-CSDN博客
STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器相关推荐
- STL源码剖析学习七:stack和queue
STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...
- STL源码剖析 slist单向链表概述
概述 SGI STL的list是一个双向链表,单向链表是slist,其不在标准规格之内 单向和双向链表的区别在于,单向链表的迭代器是单向的 Forward Iterator,双向链表的迭代器属于双向的 ...
- STL源码剖析(一)STL简介
STL源码剖析(一)STL简介 文章目录 STL源码剖析(一)STL简介 一.STL概述 二.STL六大组件 2.1 容器(containers) 2.2 算法(algorithms) 2.3 迭代器 ...
- 《STL源码剖析》相关面试题总结
一.STL简介 STL提供六大组件,彼此可以组合套用: 容器 容器就是各种数据结构,我就不多说,看看下面这张图回忆一下就好了,从实现角度看,STL容器是一种class template. 算法 各种常 ...
- C++ STL源码剖析 笔记
写在前面 记录一下<C++ STL源码剖析>中的要点. 一.STL六大组件 容器(container): 各种数据结构,用于存放数据: class template 类泛型: 如vecto ...
- STL源码剖析之配接器
adapter(配接器)在STL组件的灵活组合运用上,扮演者转换器的角色.adapter来源于一种适配器模式,其功能是:将一个class接口转换为另一个class的接口,使得原本因接口不兼容而不能合作 ...
- 【STL源码剖析】list模拟实现 | 适配器实现反向迭代器【超详细的底层算法解释】
今天博主继续带来STL源码剖析专栏的第三篇博客了! 今天带来list的模拟实现! 话不多说,直接进入我们今天的内容! 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://b ...
- STL(C++标准库,体系结构及其内核分析)(STL源码剖析)(更新完毕)
文章目录 介绍 Level 0:使用C++标准库 0 STL六大部件 0.1 六大部件之间的关系 0.2 复杂度 0.3 容器是前闭后开(左闭右开)区间 1 容器的结构与分类 1.1 使用容器Arra ...
- 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1
最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...
最新文章
- centos共享linux文件夹权限,CENTOS7 搭建文件服务器:samba共享linux文件夹
- 用linux集成电路版图设计,集成电路版图设计教程2012版本
- C++:34---union:联合/共用体,一种节省空间的类
- IDEA创建.properties文件
- sftp方式从windows上传文件到Linux服务器
- VSCode配置jupyter逐行语句运行python
- 南加大计算机科学博士,美国南加州大学计算机科学博士专业介绍
- 中国证券IT发展简史(上)
- mysql中Mysql模糊查询like效率,以及更高效的写法和sql优化方法
- Win10设置系统保护色
- matlab 求最大值函数,利用matlab, 二元函数求最大值
- ec12编码器电路图_旋转编码器电路原理图
- word 批量替换空格和回车
- 4g网络什么时候淘汰_4g网络手机。什么时候淘汰
- python 录屏_python实现录制全屏和选择区域录屏功能
- FCM推送 push
- There is no setter for property named ‘id‘ in ‘class com.atguigu.mybatistest.entity.User‘
- 大于4GB镜像文件刻录方法
- Delfoi CUT 3D切割和精加工工艺离线编程软件丨衡祖仿真
- 【计算机毕业设计】足球赛会管理系统
热门文章
- 【转】WPF入门教程系列六——布局介绍与Canvas(一)
- Dynamics 365 On-premises和Online 的不同
- Sharepoint学习笔记—Ribbon系列
- linux 或者xshell等工具输入错误命令 删除键显示^H 解决办法
- REVERSE-PRACTICE-BUUCTF-27
- 【NC140 排序】手写快速排序
- 【LeetCode1046】最后一块石头的重量(堆heap)
- 【POJ - 1523】SPF(Tarjan求割点,求分割成的连通块数,模板题,tricks)
- 【HDU - 5934】Bomb (强连通分量Tarjan + 缩点)
- 2.1)深度学习笔记:深度学习的实践层面