从零开始写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库配合使用 基本运算符 ...
随机推荐
- 在Windows7下编译调试C#程序
要在 命令行下编译C#代码,要配置一下 1.在环境变量下新建一个变量 参数名: csc 参数值:C:\Windows\Microsoft.NET\Framework\v4.0.30319 2.在系统变 ...
- jvm 脑图
- c# 导出DataSet到excel
public static bool ExportToExcel_dataSet(string queryNo, string conditions) { bool _bl = false; try ...
- C++ 引用、指针
一.引用 1.引用的作用:给变量起一个别名,是c++对c的扩充.原名和别名有相同的地址,根本上就是同一个东西,只是名字不一样.c++的引用机制主要是为了用作函数参数,增强函数传递数据的能力,比如swa ...
- PHP文件及目录考察点
文件读取/写入操作 fopen()函数 用来打开一个文件,打开时需要指定打开模式 打开模式 模式 |作用 --- |--- 'r' |只读方式打开,将文件指针指向文件头. 'r+' |读写方式打开,将 ...
- g20学习笔记
BALProblem.h---------定义BALProblem类. BALProblem类保存我们的BA所需要的所有数据,包括相机与路标之间的联系,相机变量+路标变量的初始值.这些数据的原始信息都 ...
- 入门迅速、应用广泛、月薪两万,马哥Python前景为什么这么好?
随着Python的技术的流行,Python在为人们带来工作与生活上带来了很多的便捷,因为Python简单,学起来快,也是不少新手程序员入门的首选语言.新手们比较关心的就是Python的发展前景与方向. ...
- [Python3网络爬虫开发实战] 1.8.3-Scrapy-Splash的安装
Scrapy-Splash是一个Scrapy中支持JavaScript渲染的工具,本节来介绍它的安装方式. Scrapy-Splash的安装分为两部分.一个是Splash服务的安装,具体是通过Dock ...
- 如何系统学习并且掌握JavaScript
- LNMP构架搭建论坛
1 yum install -y apr* autoconf automake bison bzip2 bzip2* compat* cpp curl curl-devel fontconfig fo ...