C++-容器适配器- stack、queue、priority_queue和仿函数
目录
1.什么是适配器
2.deque
1.简单了解结构
2.deque的缺陷
3.为什么选择deque作为stack和queue的底层默认容器
3.stack(栈)
4.queue(队列)
5.仿函数
6.priority_queue(优先级队列)(堆)
1.什么是适配器
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设 计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。
2.deque
1.简单了解结构
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与 list比较,空间利用率比较高。
deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:

这里是有一个中枢数组存放着各个开出空间的起始地址也就是指针。而这些指针都是存放在中枢数组的中间位置,以便头部的插入删除操作,给整个指针数组前面的空间先空着,等待有头插操作再放指针。
2.deque的缺陷
与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是比vector高的。
与list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段。
但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。
3.为什么选择deque作为stack和queue的底层默认容器
stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如 list。但是STL中对stack和queue默认选择deque作为其底层容器,主要是因为:
1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。
2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据,比如realloc之类的);queue中的元素增长时,deque不仅效率高,而且内存使用率高。
3.stack(栈)
template<class T, class Container = deque<T>>
class stack
{
public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top() const{return _con.back();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;
};
4.queue(队列)
template<class T, class Container = deque<T>>
class queue
{
public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}const T& front() const{return _con.front();}const T& back() const{return _con.back();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;
};
5.仿函数
仿函数顾名思义就是仿照函数写的一种模式。也就是在一个类里重载了运算符()。
template<class T>
class Less
{
public:bool operator()(const T& x, const T& y){return x < y;}
};int main()
{int a = 3;int b = 4;//用匿名对象调用仿函数bool c = Less<int>()(a, b);//用已经存在的对象调用仿函数Less<int> com;bool d = com(a, b);cout << c << endl;cout << d << endl;return 0;
}
结果:
![]()
6.priority_queue(优先级队列)(堆)
template<class T>
class Less
{
public:bool operator()(const T& x, const T& y){return x < y;}
};template<class T>
class Greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};// 默认是大堆
template<class T, class Container = vector<T>, class Compare = Less<T>>
class priority_queue
{
public:void AdjustUp(int child){Compare com;int parent = (child - 1) / 2;while (child > 0){//if (_con[parent] < _con[child])if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}void push(const T& x){_con.push_back(x);AdjustUp(_con.size() - 1);}void AdjustDown(int parent){// 先假设左孩子小size_t child = parent * 2 + 1;Compare com;while (child < _con.size()) // child >= n说明孩子不存在,调整到叶子了{// 找出小的那个孩子//if (child + 1 < _con.size() && _con[child] < _con[child + 1])if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){++child;}//if (_con[parent] < _con[child])if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();AdjustDown(0);}const T& top(){return _con[0];}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;
};
相关文章:
C++-容器适配器- stack、queue、priority_queue和仿函数
目录 1.什么是适配器 2.deque 1.简单了解结构 2.deque的缺陷 3.为什么选择deque作为stack和queue的底层默认容器 3.stack(栈) 4.queue(队列) 5.仿函数 6.priority_queue(优先级队列)(堆…...
C++游戏开发指南
C游戏开发指南 引言 在这个数字娱乐时代,游戏行业炙手可热,你是否也憧憬着能亲自开发出一款独特的游戏呢?你是否想过,为什么越来越多的开发者选择C作为他们的开发语言?没错,C不仅是一种高效的编程语言&am…...
k8s的pod管理及优化
资源管理介绍 资源管理方式 命令式对象管理:直接用命令去操作kubernetes资源 命令式对象配置:通过命令配置和配置文件去操作kubernets资源 声明式对象配置:通过apply命令和配置文件去操作kubernets资源 命令式对象管理: 资源类…...
HTML 常用的块级元素和行内元素
1. 常用的块级元素 块级元素具有如下特点: 占据父容器的整行宽度。通常从新的一行开始。可以包含其他块级元素和行内元素。 常用的块级元素: div:通用的容器,用于布局和分块内容。 h1 到 h6:标题标签,定义…...
js短路求值
短路求值(short-circuit evaluation)是指在逻辑运算中,如果前面的表达式已经能够确定整个表达式的结果,后面的表达式就不会被执行。短路求值常见于逻辑运算符 &&(与)和 ||(或࿰…...
react 知识点汇总(非常全面)
React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发并维护。它的核心理念是“组件化”,即将用户界面拆分为可重用的组件。 React 的组件通常使用 JSX(JavaScript XML)。JSX 是一种 JavaScript 语法扩展,…...
如何加密重要U盘?U盘怎么加密保护?
在日常生活中,我们常常使用U盘来存储和传输重要文件。然而,U盘的便携性也意味着它容易丢失或被盗。为了保护U盘中的数据安全,我们需要对U盘进行加密。本文将为您介绍如何加密重要U盘,以及U盘加密保护的方法。 BitLocker BitLocke…...
js编写一个中奖程序
好的,以下是一个用JavaScript编写的抽奖程序,它根据给定的概率来决定奖项。我们将使用随机数生成器来模拟抽奖过程。 function drawPrize() {const prizes [{ name: 特等奖, probability: 0.00000001 },{ name: 一等奖, probability: 0.00000003 },{ n…...
Mybatis-plus的基础用法
文章目录 1. 核心功能1.1 配置与编写规则1.2 条件构造器1.3 自定义SQL1.4 IService接口1.4.1 Lambda方法1.4.2 批量新增 1.5 分页查询 2. 拓展功能2.1 代码生成器2.2 DB静态工具2.3 逻辑删除2.4 枚举处理器 参考 1. 核心功能 1.1 配置与编写规则 Maven依赖: <…...
【网络篇】计算机网络——应用层详述(笔记)
目录 一、应用层协议原理 1. 进入应用层 2. 网络应用程序体系结构 (1)客户-服务器体系结构(client-server architecture) (2) P2P 体系结构(P2P architecture) 3. 进程间通讯 …...
力扣10.9
3171. 找到按位或最接近 K 的子数组 给你一个数组 nums 和一个整数 k 。你需要找到 nums 的一个 子数组 ,满足子数组中所有元素按位或运算 OR 的值与 k 的 绝对差 尽可能 小 。换言之,你需要选择一个子数组 nums[l..r] 满足 |k - (nums[l] OR nums[l 1…...
@RequestMapping指定请求方式的用法
RequestMapping("/depts")public Result list() {log.info("查询全部部分数据");return Result.success();}上面代码没有指定请求方式,通过postman测试,可以用GET,POST,Delete的方式调用。 要想指定请求方式…...
卷积神经网络细节问题及知识点
一、Batch Normalization Batch Normalization(BN,批归一化) 是深度学习中的一种技术,主要用于加速神经网络的训练过程,同时提高网络的稳定性和收敛速度。它通过对每一层的输出进行归一化,减少梯度消失和梯…...
【图论】(一)图论理论基础与岛屿问题
图论理论基础与岛屿问题 图论理论基础深度搜索(dfs)广度搜索(bfs)岛屿问题概述 岛屿数量岛屿数量-深搜版岛屿数量-广搜版 岛屿的最大面积孤岛的总面积沉没孤岛建造最大人工岛水流问题岛屿的周长 图论理论基础 这里仅对图论相关核…...
PhotoMaker部署文档
一、介绍 PhotoMaker:一种高效的、个性化的文本转图像生成方法,能通过堆叠 ID 嵌入自定义逼真的人类照片。相当于把一张人的照片特征提取出来,然后可以生成你想要的不同风格照片,如写真等等。 主要特点: 在几秒钟内…...
双十一买什么最划算?2024年双十一选购攻略汇总!
随着一年一度的双十一购物狂欢节日益临近,消费者们纷纷摩拳擦掌,准备在这个全球最大的购物盛宴中抢购心仪已久的商品。双十一不仅是一场购物的狂欢,更是商家们推出优惠、促销的绝佳时机。然而,面对琳琅满目的商品和纷繁复杂的优惠…...
Oracle架构之物理存储之审计文件
文章目录 1 审计文件(audit files)1.1 定义1.2 查看审计信息1.3 审计相关参数1.4 审计的类型1.4.1 语句审计1.4.2 权限审计1.4.3 对象审计1.4.4 细粒度的审计 1.5 与审计相关的数据字典视图 1 审计文件(audit files) 1.1 定义 审…...
DAY6 面向对象
概念 对象是一种特殊的数据结构,可以用来记住一个事物的数据,从而代表该事物,可以理解为一个模板表,总而言之万物皆对象,比如一个人、一个物体等。 怎么创建对象 先设计对象的模板,也就是对象的设计图&a…...
代码随想录 (三)—— 哈希表部分刷题
当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。 数组set (集合)map(映射) 在java中有就是,hashmap, LinkedHashMap, TreeMap ,HashTable 等 总结一下,当我们遇到了要快速判断一个…...
搜维尔科技:使用 SenseGlove Nova 2 远程操作机械手,实现了对鸡蛋的精细操控
使用SenseGlove Nova 2远程操作机械手,实现了对鸡蛋的精细操控 搜维尔科技:使用 SenseGlove Nova 2远程操作机械手,实现了对鸡蛋的精细操控...
j | 禁忌 | n |孩
通过网盘分享的文件:禁 | 忌女 | 孩(日版) 链接: https://pan.baidu.com/s/1bjsnnvP2f1EiA8ySTbCAOg?pwdtqp2 提取码: tqp2...
MetaClaw:基于MAML的元学习框架,让AI智能体快速适应新任务
1. 项目概述:当“元学习”遇上“智能体”,一个开源框架的诞生最近在智能体(Agent)和元学习(Meta-Learning)的交叉领域,发现了一个挺有意思的开源项目——MetaClaw。这个项目来自 aiming-lab&…...
5分钟掌握全平台炫酷抽奖:Magpie-LuckyDraw开源项目深度解析
5分钟掌握全平台炫酷抽奖:Magpie-LuckyDraw开源项目深度解析 【免费下载链接】Magpie-LuckyDraw 🏅A fancy lucky-draw tool supporting multiple platforms💻(Mac/Linux/Windows/Web/Docker) 项目地址: https://gitcode.com/gh_mirrors/ma…...
卡片里放图片?用 memory:// 协议才是正确打开方式
文章目录卡片图片的限制项目结构卡片 UI:用 memory:// 显示图片FormAbility:下载图片 → 写入共享内存 → 推送更新显示本地图片(无需下载)memory:// 协议原理关键注意事项写在最后卡片里显示图片这件事比我想象的要麻烦一点。卡片…...
ChartGPT:用自然语言重塑数据可视化的智能革命
ChartGPT:用自然语言重塑数据可视化的智能革命 【免费下载链接】chart-gpt AI tool to build charts based on text input 项目地址: https://gitcode.com/gh_mirrors/ch/chart-gpt 在数据驱动决策的时代,图表已成为信息传递的通用语言。然而&…...
终极指南:FigmaCN中文插件让设计师告别英文障碍
终极指南:FigmaCN中文插件让设计师告别英文障碍 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的全英文界面而烦恼吗?Figma中文插件FigmaCN正是为你…...
从碎片到体系:如何用Obsidian Weread插件打造你的个人读书知识库
从碎片到体系:如何用Obsidian Weread插件打造你的个人读书知识库 【免费下载链接】obsidian-weread-plugin Obsidian Weread Plugin is a plugin to sync Weread(微信读书) hightlights and annotations into your Obsidian Vault. 项目地址: https://gitcode.com…...
wBlock Safari扩展架构详解:5个内容拦截扩展的协同工作原理
wBlock Safari扩展架构详解:5个内容拦截扩展的协同工作原理 【免费下载链接】wBlock The next-generation ad blocker for Safari. 项目地址: https://gitcode.com/gh_mirrors/wb/wBlock wBlock是一款下一代Safari广告拦截器,通过创新的多扩展架构…...
手把手教你用Vivado 2019.1和Tri Mode Ethernet MAC IP,在Artix-7上搞定千兆UDP通信(附RTL8211E/YT8531C/KSZ9031配置)
基于Artix-7的千兆以太网UDP通信实战指南 在嵌入式系统开发中,实现稳定可靠的网络通信一直是工程师面临的挑战之一。特别是当项目需要高速数据传输时,如何选择合适的硬件平台和协议栈就显得尤为重要。本文将聚焦Xilinx Artix-7 FPGA平台,详细…...
阶段与关口:项目管理中的核心触发器与决策机制解析
1. 从“触发器”说起:为什么我们需要阶段与关口?在汽车电子、软件开发乃至任何复杂的项目管理中,我们常常听到“触发器”这个词。它就像一个开关,一个信号,标志着某个条件已经满足,可以启动下一系列动作。今…...
