手拆STL

article/2025/8/12 0:48:42

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.hkcw.cn/article/mhbxkBbknG.shtml

相关文章

CppCon 2014 学习: C++ Test-driven Development

“Elephant in the Room”这个比喻常用来形容那些大家都知道但没人愿意讨论的重大问题。 这段内容讲的是软件质量管理的经典做法和潜在的问题&#xff1a; 经典做法&#xff1a;开发完成后才进行人工测试&#xff08;manual testing after creation&#xff09;。隐喻“Cape o…

vscode编辑器怎么使用提高开发uVision 项目的效率,如何编译Keil MDK项目?

用vscode编译uVision 项目只需要安装一个Keil Assistant插件&#xff0c;即可用vscode开发“keil 项目”。极大提高开发速度&#xff01; 1.安装Keil Assistant插件 安装插件成功之后&#xff0c;应该会让安装一个东西&#xff0c;点击安装即可 2.配置安装包路径 3.打开 uVi…

w~大模型~合集7

我自己的原文哦~ https://blog.51cto.com/whaosoft/13960246 #语言模型是否会规划未来 token Transformer本可以深谋远虑&#xff0c;但就是不做,语言模型是否会规划未来 token&#xff1f;这篇论文给你答案。 「别让 Yann LeCun 看见了。」 Yann LeCun 表示太迟了&am…

Tomcat优化篇

目录 一、Tomcat自身配置 1.Tomcat管理页面 2. 禁用AJP服务 3.Executor优化 4.三种运行模式 5.web.xml 6.Host标签 7.Context标签 8.启动速度优化 9.其他方面 二、JMeter测试 笔者推荐 一、Tomcat自身配置 1.Tomcat管理页面 我们可以打开Tomcat的管理页面&#xff…

VectorStore 组件深入学习与检索方法

考虑到目前市面上的向量数据库众多&#xff0c;每个数据库的操作方式也无统一标准&#xff0c;但是仍然存在着一些公共特征&#xff0c;LangChain 基于这些通用的特征封装了 VectorStore 基类&#xff0c;在这个基类下&#xff0c;可以将方法划分成 6 种&#xff1a; 相似性搜…

深入理解短链服务:原理、设计与实现全解析

TinyURL 是全球最早提供短链服务的网站&#xff0c;被视为短链系统的鼻祖。如今&#xff0c;国内的主流互联网公司也纷纷推出了自己的短链平台&#xff0c;比如新浪的 t.cn、百度的 dwz.cn、腾讯的 url.cn 等。 随着业务复杂度的提升和数据量的剧增&#xff0c;短链服务不仅是…

OpenCV C++ 学习笔记(三):矩阵基本操作、遍历图像矩阵的方法及性能分析

文章目录 图像矩阵在内存中的存储矩阵基本操作高性能法——使用经典的C风格运算符[]&#xff08;指针&#xff09;迭代器法通过指定On-the-fly地址查找核心函数LUT性能分析 常用数据类型定义&#xff1a; cv::Size(cols, rows); cv::Size(width, height);cv::Scalar(gray) cv:…

java26

1.异常 报错原因&#xff1a; 缺少 性能优化是指&#xff1a;"a""b""c"----------->"abc" 下面是异常的报错信息&#xff1a; 报错信息&#xff1a; 注意&#xff1a;报错位置从下往上看 异常作用二的体现&#xff1a; 结果&…

【Oracle】高级部分 - 从入门到精通的进阶之路

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 &#x1f680; 性能优化篇&#xff1a;让Oracle跑得飞快1. 执行计划分析 - 数据库的"透视眼"2. 索引优化策略 - 数据库的"导航系统"3. 分区表的威力 - 数据库的"分治策略" &…

【AI论文】推理语言模型的强化学习熵机制

摘要&#xff1a;本文旨在克服将强化学习扩展到使用 LLM 进行推理的主要障碍&#xff0c;即策略熵的崩溃。 这种现象在没有熵干预的RL运行中一直存在&#xff0c;其中策略熵在早期训练阶段急剧下降&#xff0c;这种探索能力的减弱总是伴随着策略性能的饱和。 在实践中&#xff…

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…

【HarmonyOS Next之旅】DevEco Studio使用指南(二十九) -> 开发云数据库

目录 1 -> 开发流程 2 -> 创建对象类型 3 -> 添加数据条目 3.1 -> 手动创建数据条目文件 3.2 -> 自动生成数据条目文件 4 -> 部署云数据库 1 -> 开发流程 云数据库是一款端云协同的数据库产品&#xff0c;提供端云数据的协同管理、统一的数据模型和…

[Python] Python自动化:PyAutoGUI的基本操作

初次学习&#xff0c;如有错误还请指正 目录 PyAutoGUI介绍 PyAutoGUI安装 鼠标相关操作 鼠标移动 鼠标偏移 获取屏幕分辨率 获取鼠标位置 案例&#xff1a;实时获取鼠标位置 鼠标点击 左键单击 点击次数 多次有时间间隔的点击 右键/中键点击 移动时间 总结 鼠…

【Hot 100】45. 跳跃游戏 II

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

QT-JSON

#include <QJsonDocument>#include <QJsonObject>#include <QJsonArray>#include <QFile>#include <QDebug>void createJsonFile() {// 创建一个JSON对象 键值对QJsonObject jsonObj;jsonObj["name"] "John Doe";jsonObj[…

blender 手柄驱动开发-ubuntu

ubuntu 如何安装blender 官网blender.org下载tar.xz压缩文件 tar -xvf xxx.tar.xz如何启动blender,命令行输入&#xff1a; blender 如何在blender中安装pygame模块 需要找到blender中的python解释器路径import sys print(sys.executable)然后在终端terminal中使用以下命令 $ …

(9)-Fiddler抓包-Fiddler如何设置捕获Https会话

1.简介 由于近几年来各大网站越来越注重安全性都改成了https协议&#xff0c;不像前十几年前直接是http协议直接裸奔在互联网。接着讲解如何抓取https协议会话。 2.什么是HTTPS&#xff1f; HTTPS就是加过密的HTTP。使用HTTPS后&#xff0c;浏览器客户端和Web服务器传输的数…

差分隐私技术的有效性和局限性

差分隐私&#xff08;Differential Privacy, DP&#xff09;由计算机科学家Cynthia Dwork于 2006 年提出&#xff0c;其核心思想是&#xff1a;通过向数据中添加精心设计的随机噪声&#xff0c;确保单个个体的加入或删除不会显著改变数据分析结果的分布&#xff0c;从而从数学上…

篇章七 数据结构——栈和队列

目录 1. 栈(Stack) 1.1 概念 1.图示栈概念&#xff1a; 2.栈在现实生活中的例子&#xff1a; 1.2 栈的使用 1.3 栈的模拟实现 1.接口 2.数组实现 1.4 栈的应用场景 1. 改变元素的序列 2.单链表是否可以实现栈&#xff1f; 2.1 数组实现&#xff1a;顺序栈 2.2 链…

LM393红外避障电路Multisim仿真

电路分析&#xff1a; 开关S1模拟物体的靠近&#xff0c;当按键按下时&#xff0c;表示有物体靠近。 当没有检测到物体时&#xff08;按键没有按下&#xff09;&#xff0c;LM393D的同相端被R2拉高&#xff0c;电压为5V。 此时反相端的电压经过两个电阻分压后&#xff0c;电压…