当前位置: 首页 > news >正文

C++的stack和queue类(一):适配器模式、双端队列与优先级队列

目录

基本概念

适配器模式       

stack.h

test.cpp

双端队列-deque

仿函数

优先级队列


基本概念

1、stack和queue不是容器是容器适配器,它们没有迭代器

2、stack的quque的默认容器是deque,因为:

  1. stack和queue不需要遍历,只需要在固定的一端或者两端进行操作。
  2. 在stack中元素增加需要扩容时,deque比vector的效率高(不需要搬移大量数据)
  3. queue中的元素增长时,deque不仅效率高,而且内存使用率高

适配器模式       

        适配器模式是一种设计模式,用于将一个类的接口转换成客户希望的另一个接口,这种类型的设计模式属于结构型模式,它涉及到单个类的功能增强,适配器模式中有三个主要角色:

  • 目标接口:客户端所期待使用的接口,适配器通过实现这个目标接口来与用户进行交互
  • 被适配者:需要被适配以符合目标接口规范的现有类
  • 适配器:实现了目标接口,并持有一个对被适配者对象的引用,在其方法内部调用被适配者对象来完成特定操作

stack.h

#pragma once
#include <assert.h>
#include <vector>
#include <list>
namespace bit 
{//适配器模式//stack<int,vector<int>> st1;//stack<int,list<int>> st2;template<class T, class Container>class stack{public://入栈void push(const T& x){_con.push_back(x);}//出栈void pop(){_con.pop_back();}//求大小size_t size(){return _con.size();}//判空bool empty(){return _con.empty();}//获取栈顶元素const T& top(){return _con.back();}private:Container _con;};
}
  • 目标接口:构成栈所需的操作接口
  • 被适配者:实现栈的底层数据结构(数组或链表) 
  • 适配器:bit::stack类

test.cpp

#include "Queue.h"
#include "Stack.h"
#include <stack>
#include <iostream>
using namespace std;void test_stack1()
{bit::stack<int,vector<int>> st;st.push(1);st.push(2);st.push(3);st.push(4);while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;}int main()
{test_stack1();return 0;
}

注意事项:函数参数传递的是对象,模板参数传递的是类型,函数参数可以传递缺省值,模板参数也可以传递缺省值

template<class T, class Container = vector<int>>
bit::stack<int> st; //此时就等价于bit::stack<int,vector<int>> st

双端队列-deque

vector优缺点 

  • 优点:支持下标随机访问
  • 缺点:头部或中间插入删除效率低,扩容有消耗

list的优缺点:

  • 优点:任意位置插入删除效率都不错
  • 缺点:不支持下标的随机访问

(第一个stack和queue的2:30:00处)

基本概念:deque是一种双开口的”连续“空间的数据结构,与vector相比,头插效率高,不需要搬移元素,与list相比,空间利用率更高,deque不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组

优点:deque 允许在两端进行高效插入和删除操作,且支持下标的随机访问

缺点:中间插入删除效率一般、[]效率一般(遍历时deque要频繁的检查是否移动到小空间边界)

 

仿函数

基本概念:仿函数是一个类或结构体,它重载了函数调用运算符 operator(),通过重载该运算符,这个类的实例就可以被像函数一样调用

#include <iostream>//仿函数 + 函数模板
template <class T>
struct MyComparator 
{bool operator()(const T& x,const T& y) {return x < y;}
};int main() {MyComparator<int> cmp;cout<< cmp(1, 2) << endl;//有名对象cout<< cmp.operator()(1, 2) << endl;//有名对象cout<< MyComparator<int>()(1, 2) << endl;//匿名对象cout<< MyComparator<int>().operator()(1, 2) << endl;//匿名对象return 0;
}

优先级队列

~over~

相关文章:

  • ARM、X86、RISC-V三分天下
  • Android 14.0 SystemUI修改状态栏电池图标样式为横屏显示
  • Sybase ASE中的char(N)的坑以及与PostgreSQL的对比
  • 【机器学习】决策树(Decision Tree,DT)算法介绍:原理与案例实现
  • 如何使用Python中的logging模块进行日志记录?
  • 301永久重定向与302临时重定向的正确运用
  • 适用于 Windows 10 的 10 大免费数据恢复软件
  • Go语言中测试和性能
  • 速盾:服务器有cdn 带宽上限建议多少
  • HBase详解(4)
  • 云计算存在的安全隐患
  • PyQt PySide6零基础入门与项目实战视频教程
  • 静态路由协议
  • mac/win使用pyinstaller打包app/exe文件,活着执行脚本,双击运行
  • 数据库讲解---(数据查询)【MySQL版本】
  • 深入了解以太坊
  • @jsonView过滤属性
  • 【mysql】环境安装、服务启动、密码设置
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Android优雅地处理按钮重复点击
  • httpie使用详解
  • JavaScript 奇技淫巧
  • REST架构的思考
  • 阿里云Kubernetes容器服务上体验Knative
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 观察者模式实现非直接耦合
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 配置 PM2 实现代码自动发布
  • 前端面试总结(at, md)
  • 三栏布局总结
  • 详解移动APP与web APP的区别
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 阿里云ACE认证学习知识点梳理
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • # Panda3d 碰撞检测系统介绍
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #include到底该写在哪
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (一)appium-desktop定位元素原理
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .net6使用Sejil可视化日志
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [Android]通过PhoneLookup读取所有电话号码
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [ASP]青辰网络考试管理系统NES X3.5
  • [CISCN2019 华东南赛区]Web11
  • [JavaWeb]—Spring入门
  • [Labtools 27-1429] XML parser encountered a problem in file
  • [LeetCode] 148. Sort List 链表排序
  • [LeetCode] Merge Two Sorted Lists
  • [NOIP2000] 乘积最大
  • [Pytorch]:PyTorch中张量乘法大全