手拆STL

vector

v e c t o r vector vector,动态数组。
先来看一下它的一些基本操作及其拆后残渣。
1.a.push_back(x),将 x x x加入动态数组 a a a的末尾。
实现:a[++cnt]=x
2.a.size(),查询动态数组 a a a中元素的数量。
实现:cnt
3.a.pop_back(),将动态数组 a a a末尾的元素删除。
实现:cnt--
4.a.erase(a.begin()+x),删除动态数组 a a a中第 x + 1 x+1 x+1个元素。
实现:for(int i=x+1;i<=--cnt;i++)a[i]=a[i+1];
5.a.clear(),清空动态数组 a a a
实现:cnt=0
总体实现:

int a[N];
int cnt;
void Push_back(int x){a[++cnt]=x;
}
int Size(){return cnt;
}
void Pop_back(){cnt--;
}
void Erase(int x){for(int i=x+1;i<=--cnt;i++)a[i]=a[i+1];
}
void Clear(){cnt=0;
}

queue

q u e u e queue queue,队列。
队列常用的操作:
1.q.push(x),向队列 q q q中加入一个元素 x x x
实现:q[++tail]=x
2.q.pop(),弹出队列 q q q的队首。
实现: head++
3.q.front(),查询队列 q q q的队首。
实现:q[head+1]
4.q.back(),查询队列 q q q的队尾。
实现:q[tail]
5.q.empty(),判断队列 q q q是否为空。
实现:(head==tail)
6.q.size(),查询队列 q q q的元素个数
实现:tail-head
手写的思想:两个变量 h e a d head head t a i l tail tail h e a d head head存队头前一个元素的下标, t a i l tail tail存队尾的下标。
总体实现:

int q[N];
int head,tail;
void Push(int x){q[++tail]=x;
}
void Pop(){head++;
}
int Front(){return q[head+1];
}
int Back(){return q[tail];
}
bool Empty(){return head==tail;
}
int Size(){return tail-head;
}

deque

d e q u e deque deque,双端队列。
一些基本操作:
1.q.push_back(x),在双端队列 q q q的队尾加入一个元素 x x x
实现:q[++tail]=x
2.q.push_front(x),在双端队列 q q q的队头加入一个元素 x x x
实现:q[head--]=x
3.q.front(),查询双端队列 q q q的队头。
实现:q[head+1]
4.q.back(),查询双端队列 q q q的队尾。
实现:q[tail]
5.q.pop_back(),弹出双端队列 q q q的队尾。
实现:tail--
6.q.pop_front(),弹出双端队列 q q q的队头。
实现:head++
手写的思想:两个变量 h e a d head head t a i l tail tail,开双倍的数组空间 N N N,将 h e a d head head t a i l tail tail都初始化为 N 2 \frac{N}{2} 2N h e a d head head存队头前一个元素的下标, t a i l tail tail存队尾的下标。
总体实现:

int q[N];
int head=N/2,tail=N/2;
void Push_back(int x){q[++tail]=x;
}
void Push_front(int x){q[head--]=x;
}
int Front(){return q[head+1];
}
int Back(){return q[tail];
}
void Pop_back(){tail--;
}
void Pop_front(){head++;
}

priority_queue

p r i o r i t y q u e u e priority_queue priorityqueue,优先队列。
要拆优先队列,首先得明白优先队列的运行规则。
优先队列实际上是在维护一个二叉堆
二叉堆就是一颗完全二叉树,那么要维护这个二叉堆的什么状态呢?
答案是维护二叉堆的每一个非叶子节点的值都大于等于(或者小于等于)它的两个儿子的值。
那么……开拆。(大根堆)
优先队列的常用操作:
1.q.push(x),将元素 x x x加入优先队列 q q q
对于一个元素,从左至右依次加入二叉堆,如果父亲节点有了这个儿子之后就违法了,那么它就当父亲了,父亲自然成了儿子。
例如向下面这个二叉堆加入一个元素 7 7 7
在这里插入图片描述

实现:

void Push(int x){q[++cnt]=x;int p=cnt;while(p>1&&q[p/2]<q[p])swap(q[p/2],q[p]),p/=2;//维护单调性
}

2.q.top(),返回优先队列 q q q中的最值
实现:由于时刻都在维护二叉堆的单调性,所以最值就是q[1]
3.q.pop(),弹出优先队列 q q q的队头(最值)。
实现:

void Pop(){q[1]=q[cnt--];q[cnt+1]=0;int p=1;while(p<=cnt&&q[p]<max(q[p*2],q[p*2+1])){//维护//判断左儿子和右儿子哪一个更大if(q[p*2]>q[p*2+1])swap(q[p],q[p*2]),p*=2;else swap(q[p],q[p*2+1]),p=p*2+1;}
}

思想:维护一个二叉堆。
总体实现:

int q[N];
int cnt;
void Push(int x){q[++cnt]=x;int p=cnt;while(p>1&&q[p/2]<q[p])swap(q[p/2],q[p]),p/=2;
}
int Top(){return q[1];
}
void Pop(){q[1]=q[cnt--];q[cnt+1]=0;int p=1;while(p<=cnt&&q[p]<max(q[p*2],q[p*2+1])){if(q[p*2]>q[p*2+1])swap(q[p],q[p*2]),p*=2;else swap(q[p],q[p*2+1]),p=p*2+1;}
}

stack

s t a c k stack stack,栈。
栈的基本操作:
1.t.push(x),将元素 x x x加入栈 t t t中。
实现:t[++cnt]=x
2.t.pop(),弹出栈 t t t的栈顶。
实现:cnt--
3.t.top(),查询栈 t t t的栈顶元素。
实现:t[cnt]
4.t.empty,判断栈 t t t是否为空。
实现:(!cnt)
5.t.size(),查询栈 t t t的元素个数。
实现:cnt
总体实现:

int t[N];
int cnt;
void Push(int x){t[++cnt]=x;
}
void Pop(){cnt--;
}
int Top(){return t[cnt];
}
bool Empty(){return !cnt;
}
int Size(){return cnt;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.01打卡

浙大疏锦行 DAY 40 训练和测试的规范写法 知识点回顾&#xff1a; 1. 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中 2. 展平操作&#xff1a;除第一个维度batchsize外全部展平 3. dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模…

CSS专题之层叠上下文

前言 石匠敲击石头的第 15 次 在平常开发的时候&#xff0c;有时候会遇到使用 z-index 调整元素层级没有效果的情况&#xff0c;究其原因还是因为对层叠上下文不太了解&#xff0c;看了网上很多前辈的文章&#xff0c;决定打算写一篇文章来梳理一下&#xff0c;如果哪里写的有问…

RabbitMQ集群与负载均衡实战指南

文章目录 集群架构概述仲裁队列的使用1. 使用Spring框架代码创建2. 使用amqp-client创建3. 使用管理平台创建 负载均衡引入HAProxy 负载均衡&#xff1a;使用方法1. 修改配置文件2. 声明队列 test_cluster3. 发送消息 集群架构 概述 RabbitMQ支持部署多个结点&#xff0c;每个…

Prometheus + Grafana + Cadvisor:构建高效企业级服务监控体系

在现代软件开发和运维领域&#xff0c;容器化技术的应用越来越广泛&#xff0c;其中 Docker 作为最受欢迎的容器化解决方案之一&#xff0c;其容器的监控管理变得至关重要。本文将详细介绍如何使用 cadvisor、Prometheus 和 Grafana 来监控 Docker 容器的状态。 一、安装镜像 …

小提琴图绘制-Graph prism

在 GraphPad Prism 中为小提琴图添加显著性标记(如*P<0.05)的步骤如下: 步骤1:完成统计检验 选择数据表:确保数据已按分组排列(如A列=Group1,B列=Group2)。执行统计检验: 点击工具栏 Analyze → Column analyses → Mann-Whitney test(非参数检验,适用于非正态数…

【开源工具】跳过网页APP禁止粘贴限制:自动输入键盘模拟工具

&#x1f4cc; 【黑科技】跳过网页APP禁止粘贴限制&#xff1a;自动输入键盘模拟工具 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热情源自每一…

深度学习篇---face-recognition的优劣点

face_recognition库是一个基于 Python 的开源人脸识别工具&#xff0c;封装了 dlib 库的深度学习模型&#xff0c;具有易用性高、集成度强的特点。以下从技术实现、应用场景等维度分析其优劣势&#xff1a; 一、核心优势 1. 极简 API 设计&#xff0c;开发效率极高 代码量少…

Git深入解析功能逻辑与核心业务场景流程

一、Git核心功能逻辑架构 #mermaid-svg-9tj1iCr99u6QenJM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9tj1iCr99u6QenJM .error-icon{fill:#552222;}#mermaid-svg-9tj1iCr99u6QenJM .error-text{fill:#552222;st…

【大模型】情绪对话模型项目研发

一、使用框架&#xff1a; Qwen大模型后端Open-webui前端实现使用LLamaFactory的STF微调数据集&#xff0c;vllm后端部署&#xff0c; 二、框架安装 下载千问大模型 安装魔塔社区库文件 pip install modelscope Download.py 内容 from modelscope import snapshot_downlo…

Java基础 Day26

一、网络编程简介 1、概念 网络编程指在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行数据传输 2、软件架构 &#xff08;1&#xff09;CS架构&#xff08;客户端和服务端&#xff09; 在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程…

【Hot 100】45. 跳跃游戏 II

目录 引言跳跃游戏 IIdp解题贪心解题 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;【Hot 100】45. 跳跃游戏 II❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01; 引言 跳跃…

计算机网络第1章(上):网络组成与三种交换方式全解析

目录 一、计算机网络的概念二、计算机网络的组成和功能2.1 计算机网络的组成2.2 计算机网络的功能 三、电路交换、报文交换、分组交换3.1 电路交换&#xff08;Circuit Switching&#xff09;3.2 报文交换&#xff08;Message Switching&#xff09;3.3 分组交换&#xff08;Pa…

[总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析

前端性能分析大全 前端性能优化 LightHouse性能评分 性能指标监控分析 浏览器加载资源的全过程性能指标分析 性能指标 在实现性能监控前&#xff0c;先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系&#xff0c;旨在帮助开发者量…

Windows商店中的免费扫雷游戏应用

《扫雷》是一款经典的单人益智小游戏&#xff0c;1992年微软发布的Windows 3.1中加入该游戏&#xff0c;从此风靡全世界。游戏目标是通过逻辑推理&#xff0c;在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷。 此Windows应用实现了经典扫雷的…

ActiveMQ 可观测性最佳实践

ActiveMQ 介绍 ActiveMQ 是一款高性能、开源的消息中间件&#xff0c;支持多种消息协议&#xff08;如 JMS、AMQP、MQTT 等&#xff09;&#xff0c;能够实现应用程序之间的异步通信和消息传递。它提供点对点&#xff08;Queue&#xff09;和发布/订阅&#xff08;Topic&#…

【Linux命令】scp远程拷贝

文章目录 1. 基本语法与常用选项2. 使用场景和使用示例本地文件->远程主机远程主机文件->本地远程主机->另一台远程主机 3. 使用注意事项 scp&#xff08;Secure Copy Protocol&#xff09;是linux中基于ssh的安全文件传输工具&#xff0c;用于在本地和远程主机之前安…

如何优化 Harmony-Cordova 应用的性能?

以下是针对 ‌Harmony-Cordova 应用性能优化‌的完整方案&#xff0c;结合鸿蒙原生特性和Cordova框架优化策略&#xff1a; ‌⚡一、渲染性能优化‌ ‌减少布局嵌套层级‌ 使用扁平化布局&#xff08;如 Grid、GridRow&#xff09;替代多层 Column/Row 嵌套&#xff0c;避免冗…

c++学习之---模版

目录 一、函数模板&#xff1a; 1、基本定义格式&#xff1a; 2、模版函数的优先匹配原则&#xff1a; 二、类模板&#xff1a; 1、基本定义格式&#xff1a; 2、类模版的优先匹配原则&#xff08;有坑哦&#xff09;&#xff1a; 3、缺省值的设置&#xff1a; 4、ty…

SpringAI(GA):RAG下的ETL快速上手

原文链接&#xff1a;SpringAI(GA)&#xff1a;RAG下的ETL快速上手 教程说明 说明&#xff1a;本教程将采用2025年5月20日正式的GA版&#xff0c;给出如下内容 核心功能模块的快速上手教程核心功能模块的源码级解读Spring ai alibaba增强的快速上手教程 源码级解读 版本&a…

用dayjs解析时间戳,我被提了bug

引言 前几天开发中突然接到测试提的一个 Bug&#xff0c;说我的时间组件显示异常。 我很诧异&#xff0c;这里初始化数据是后端返回的&#xff0c;我什么也没改&#xff0c;这bug提给我干啥。我去问后端&#xff1a;“这数据是不是有问题&#xff1f;”。后端答&#xff1a;“…