从零开始写STL—栈和队列
从零开始写STL—栈和队列
适配器模式
- 意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
- 何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)
- 如何解决:继承或依赖(推荐)。
基于deque的栈
template<class T,class Sequence = deque<T>>
class stack
{
public:
typedef T value_type;
typedef T& reference;
typedef size_t size_type;
protected:
Sequence c;
public:
stack() :c() {}
bool empty()
{
return c.empty();
}
size_type size()
{
return c.size();
}
value_type& top()
{
if(!empty())
return *(c.begin());
else
{
std::cerr << "Top on empty Stack!" << std::endl;
std::exit(1);
}
}
void pop()
{
if(!empty())
c.pop_front();
else
{
std::cerr << "pop on empty Stack!" << std::endl;
std::exit(1);
}
}
void push(const value_type& x)
{
c.push_front(x);
}
stack<T> swap(stack<T>& rhs)
{
c.swap(rhs.c);
return *this;
}
bool operator==(stack<T> &rhs)
{
return c == rhs.c;
}
bool operator!=(stack<T>& rhs)
{
return c != rhs.c;
}
};
template<typename T>
void swap(stack<T>& a, stack<T>& b)
{
a.swap(b);
}
基于deque的队列
template<class T,class Sequence = deque<T>>
class queue
{
public:
typedef T value_type;
typedef T& reference;
typedef size_t size_type;
typedef typename Sequence::iterator iterator;
protected:
Sequence c;
void check()
{
if (empty())
{
std::cerr << "Empty !" << std::endl;
std::exit(1);
}
}
public:
queue():c(){}
iterator begin()
{
return c.begin();
}
iterator end()
{
return c.end();
}
bool empty()
{
return c.empty();
}
size_type size()
{
return c.size();
}
value_type& front()
{
check();
return *(c.begin());
}
value_type& back()
{
check();
auto tmp = c.end();
tmp--;
return *(tmp);
}
const value_type& front() const
{
check();
return *(c.begin());
}
const value_type& back() const
{
check();
return *(c.end() - 1);
}
void push(const value_type& x)
{
c.push_back(x);
}
void pop()
{
check();
c.pop_front();
}
bool operator==( queue<T>& rhs)
{
return c == rhs.c;
}
bool operator!=( queue<T>& rhs)
{
return !(*this == rhs);
}
queue<T>& swap(queue<T>& rhs)
{
c.swap(rhs.c);
return *this;
}
};
template<typename T>
void swap(queue<T> &a, queue<T> &b)
{
a.swap(b);
}
从零开始写STL—栈和队列的更多相关文章
- 从零开始写STL - 智能指针
从零开始写STL - 智能指针 智能指针的分类及其特点: scoped_ptr:初始化获得资源控制权,在作用域结束释放资源 shared_ptr: 引用计数来控制共享资源,最后一个资源的引用被释放的时 ...
- C++ STL栈和队列
在C++标准库(STL)中,实现了栈和队列,方便使用,在这里我整理了一下笔记,作简要介绍. 1,栈(stack): 头文件 : #include<stack> 定义栈 :stack< ...
- 从零开始写STL—容器—vector
从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...
- C++ STL 栈和队列
栈和队列 头文件 #include<queue> // 队列 #include<stack> //栈 定义方式 //参数就是数据类型 stack<int> s; q ...
- C++ STL 栈和队列详解
一.解释: 1.栈 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行.如下所示: 结论:后进先出(Last In First Out),简称为LIFO线性表. 举个 ...
- c++STL(栈、队列)
栈stack -先入后出FILO 栈可以理解为一个坑,先掉坑里的被压在下面,等上面的走了才能出来 头文件 <stack> 入栈 push(某东西); 栈顶元素出栈 pop(); 是否为空 ...
- STL栈与队列
#include<queue>// 队列 #include<stack>//栈 stack<int> s;//参数也是数据类型,这是栈的定义方式 queue< ...
- 从零开始写STL—模板元编程之any
any class any; (since C++17) The class any describes a type-safe container for single values of any ...
- 从零开始写STL—functional
function C++11 将任意类型的可调用(Callable)对象与函数调用的特征封装到一起. 这里的类是对函数策略的封装,将函数的性质抽象成组件,便于和algorithm库配合使用 基本运算符 ...
随机推荐
- vue-cli 3 配置打包环境
从新建项目到设置打包环境 1.vue create vue-cli-env 2.新建 vue.config.js 文件,设置baseUrl: './' 3.新建各个环境的文件,例如:.env.deve ...
- 坑爹的鲁大师,VMware Workstation 报错(AsyncSocket error)一例解决
今天准备把电脑上安装的VMware Play换成VMware Workstation,毕竟 Workstation 的快照功能还是很有必要的. 结果,VMware Workstation 安装成功后, ...
- vue 2.0 路由创建的详解过程
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- web 自动化测试 selenium基础到应用(目录)
第一章 自动化测试前提及整体介绍 1-1功能测试和自动化测试的区别 1-2自动化测试流程有哪些 1-3自动化测试用例和手工用例的区别 1-4 自动化测试用例编写 1-5 selenium的优势以及 ...
- 护卫神·云查杀系统V4.0-安全检测部分
感谢使用护卫神·云查杀系统,该软件专门查杀网页木马,完全免费,欢迎大家使用. 护卫神·云查杀系统 下载地址:http://down.huweishen.com/free/HwsKill.zip ...
- ActiveSync日志分析
Here are the steps to exporting the ActiveSync log data: Create a folder on the root of C:\ ...
- new Buffer 生成二进制数据
node编辑环境下: > new Buffer("admin")<Buffer 61 64 6d 69 6e> 通过post请求,服务端接收到是流数据,必须把流数 ...
- 01C#程序结构及编辑编译环境
C#程序结构及编辑编译环境 程序结构 C# 中的组织结构的关键概念是程序 (program).命名空间 (namespace).类型 (type).成员 (member) 和程序集 (assembly ...
- react入门(下)
react生命周期 1. 组件的三个生命周期状态: * Mount:插入真实 DOM * Update:被重新渲染 * Unmount:被移出真实 DOM2. React 为每个状态都提供了两种勾子( ...
- 【笔记】搭建OpenWrt编译环境
参考书目<B智能路由开发指南> 目标:搭建一个OpenWrt编译环境,可以同时在家里和公司使用. [2018-09-13] 刚开始想用自己的电脑共享远程桌面,但不知道什么原因搞不定,所以干 ...