从零开始写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—栈和队列的更多相关文章

  1. 从零开始写STL - 智能指针

    从零开始写STL - 智能指针 智能指针的分类及其特点: scoped_ptr:初始化获得资源控制权,在作用域结束释放资源 shared_ptr: 引用计数来控制共享资源,最后一个资源的引用被释放的时 ...

  2. C++ STL栈和队列

    在C++标准库(STL)中,实现了栈和队列,方便使用,在这里我整理了一下笔记,作简要介绍. 1,栈(stack): 头文件 : #include<stack> 定义栈 :stack< ...

  3. 从零开始写STL—容器—vector

    从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...

  4. C++ STL 栈和队列

    栈和队列 头文件 #include<queue> // 队列 #include<stack> //栈 定义方式 //参数就是数据类型 stack<int> s; q ...

  5. C++ STL 栈和队列详解

    一.解释: 1.栈 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行.如下所示: 结论:后进先出(Last In First Out),简称为LIFO线性表. 举个 ...

  6. c++STL(栈、队列)

    栈stack -先入后出FILO 栈可以理解为一个坑,先掉坑里的被压在下面,等上面的走了才能出来 头文件 <stack> 入栈 push(某东西); 栈顶元素出栈 pop(); 是否为空 ...

  7. STL栈与队列

    #include<queue>// 队列 #include<stack>//栈 stack<int> s;//参数也是数据类型,这是栈的定义方式 queue< ...

  8. 从零开始写STL—模板元编程之any

    any class any; (since C++17) The class any describes a type-safe container for single values of any ...

  9. 从零开始写STL—functional

    function C++11 将任意类型的可调用(Callable)对象与函数调用的特征封装到一起. 这里的类是对函数策略的封装,将函数的性质抽象成组件,便于和algorithm库配合使用 基本运算符 ...

随机推荐

  1. 写给W小姐的一封信

    生活 琐碎 Hallo,Preaty.对于跟人说话,我很不擅长如何开头.我不知道什么样的开头是符合我在别人心目中我应有的形象.我不知道什么样的开头符合别人预想中与我相匹配的内容.或者说什么的开头才是一 ...

  2. Angular 组件之间的传值

    第一种方法(传单个或者多个参数): 主页面方法: 先添加引用:private _routes: Router, Details(PBSCode) { this._routes.navigate(['p ...

  3. ButterKnife 在父类 点击事件没反应的解决方案

    在用继承的方式实现butterKnife的封装的时候遇到问题, butterKnife就在baseActivity中绑定的,但是父类中公共控件点击事件无效.找了半天原因,原来是子类和父类定义的点击方法 ...

  4. CentOS安装使用vnc进行远程桌面登录

    以下介绍在CentOS 7下安装vncserver并使用vnc-viewer进行登录(使用root权限): 1.运行命令yum install tigervnc-server安装vncserver: ...

  5. Java基础(十三)--深拷贝和浅拷贝

    在上篇文章:Java基础(十二)--clone()方法,我们简单介绍了clone()的使用 clone()对于基本数据类型的拷贝是完全没问题的,但是如果是引用数据类型呢? @Data @NoArgsC ...

  6. 【原】jq简易教程

    https://www.jianshu.com/p/3522fe70de19 https://www.jianshu.com/p/6de3cfdbdb0e 1. jq简介 jq可以对json数据进行分 ...

  7. thinkphp5验证码处理

    1.确定项目目录>vendor>topthink>think-captcha目录存在 2.在config中添加验证码配置 //验证码配置 'captcha' => [ // 验 ...

  8. pep8摘要

    https://www.python.org/dev/peps/pep-0008/ #!/usr/bin/python # -*- coding:utf- -*- # @filename: pep_s ...

  9. 修改python注册表

    转自:http://blog.csdn.net/u014680513/article/details/51005650 # script to register Python 2.0 or later ...

  10. Bitmap.createBitmap函数有6个重载方法

    位图剪切参考重载方法4和6,重载方法6比较简单 public static Bitmap createBitmap (Bitmap src)从原位图src复制出一个新的位图,和原始位图相同 publi ...