C++ Vector算法精讲与底层探秘:从经典例题到性能优化全解析 - 指南

news/2025/10/5 14:16:12/文章来源:https://www.cnblogs.com/ljbguanli/p/19126559

C++ Vector算法精讲与底层探秘:从经典例题到性能优化全解析 - 指南

前引:在C++标准模板库(STL)中,vector作为动态数组的实现,既是算法题解的基石,也是性能优化的关键战场。其连续内存布局、动态扩容机制和丰富的成员函数,使其在面试高频题(如LeetCode、洛谷)中频繁登场。本文聚焦​六大经典算法场景​(含杨辉三角、去重、结构体排序等),深入解析vector的​底层扩容策略​​、​​迭代器失效陷阱​​及​​内存管理优化技巧​​,结合代码复现与复杂度对比,帮助开发者从“会用”进阶到“用精”

目录

只出现一次的数字I

原理讲解 

代码展示 

杨辉三角

原理讲解 

 代码展示

电话号码字母组合

原理讲解

代码展示

整型去重

原理讲解 

 代码展示

找只出现一次的数字II

原理讲解

代码展示

只出现一次的数字III

​编辑原理讲解

代码展示

 ​编辑


只出现一次的数字I

https://leetcode.cn/problems/single-number  

原理讲解 

 这种题可以通过排序来找,但最高效的是按位异或:^

按位异或原理:比较二进制,相同为0,相异为1,如果两个数字一模一样去异或,那么就可以消除

代码展示 
class Solution {
public:
int singleNumber(vector<int>& nums) 
{
int tmp=0;
for(int i=0;isize();i++)
{
tmp^=nums[i];
}
return tmp;
}
};

当然用范围for、迭代器也是可以的,因为也是遍历(支持迭代器就支持范围for)

class Solution {
public:
int singleNumber(vector<int>& nums) 
{
int tmp=0;
//范围for
for(auto e:nums)
{
tmp^=e;
}
return tmp;
}
};
class Solution {
public:
int singleNumber(vector<int>& nums) 
{
int tmp=0;
//迭代器
auto it = nums.begin();
while(it!=nums.end())
{
tmp ^= (*it);
it++;
}
return tmp;
}
};

杨辉三角

原理讲解 

(1)第一步

首先两数的计算肯定是没有问题的,对应两个数相加即可,下面我来此题转化一下得到它的本质

从上图看见这是一个二维数组,每行的元素个数都不同,我们可以采用vector来开辟一个二维数组,下面我们来看如何开辟:vector<vector<int>>vector这是二维数组类型,为何 int 不用 int*?

外面的vector表示开辟了一定数量的类型元素,比如:vector<vector<int>> 5,表示5个vector<int>

而里面的每个vector<int>又是一个类型,这样我们可以先访问外面的->里面的,达到二维数组

如果用vector<vector<int>*>表示一定数量的一级指针也是可以的,只是访问方式就需要解引用了

(2)第二步,初始化

我们可以先通过下标访问里面的vector<int>,再调用resize给对应的vector<int>开辟空间+初始化

(3)计算对应的位置

可以看到左边是从下标2开始,右边是从下标1开始,那么空格的元素为【i-1,j-1】+【i-1,j】之和

 代码展示
class Solution {
public:
vectorint>> generate(int numRows)
{
//开辟行数
vectorint>> V(numRows);
//开辟二维数组(开辟+初始化)
for(int i=0;iresize(i+1,
1);
}
//计算指定元素
for(int i=2;ifor(int j=1;j-1][j]+V[i-1][j-1];
}
}
return V;
}
};

电话号码字母组合

https://leetcode.cn/problems/letter-combinations-of-a-phone-number

题目解读:

我们可以看到每个数字都代表着一串字符,题目会给你一串字符数字,让你用这些数字所映射的字符串去根据里面的字符组合出不同的字符串,例如:给你“34”。3代表“def”,4代表“ghi”,它们可以组合出:“dg”、“dh”、“di”、“eg”、“eh”、“ei”、“fg”、“fh”、“fi”,将这些字符串放在vector里面,返回即可

原理讲解

这题需要用到多参的递归,下面小编一步步讲解

(1)首先我们需要表达映射关系,比如“2”对应“abc”,“3对应“def”,以此类推

//映射关系
string str[10]={"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqs",
"tuv",
"wxyz"};

(2)递归函数参数:题目给的数字组合、数字下标、组合的字符串、vector<string>存储

class Solution
{
//映射关系
string str[10]={"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqs",
"tuv",
"wxyz"};
public:
//递归函数
void Compare(string digits,int val,string news,vector&)
{
//函数实现
}
vector letterCombinations(string digits) 
{
vector V;
//如果是空串,直接返回
if(digits.empty())
{
return V;
}
//调用递归函数
Compare(digits,0,"",V);
//返回结果
return V;
}
};

参数的解释:digits方便我们找到数字字母、val为数字下标、news是组合得到的字符串

(2)首先要拿到第一位数字字母映射的内容,由数字下标找到数字映射的字符串

/拿到映射内容
int tmp=digits[val]-'0';
string stl_=str[tmp];

(3)此时我们可以通过循环控制当前的字符:def,例如:

//从第一个字母开始组合
for(int i=0;i<stl_size();i++)
{
//进入第二层for循环
}

此时 i 为0,也就是指向d,下面我们想组合出 dg、dh、di,还需要调用递归函数

(4)函数的参数:

Compare(digits,val+1,news+stll[i],V);

 ghi 是第二个数字映射的字符串,但是又不能真正改变val,因为后面要回溯

 此时相当于news从原来的 "" 变成了 "d",也不能真正改变news,因为后面要回溯否则就累积了

(5)现在是递归的结束条件,如果组合完每层的字母,那就返回,回到第一层for循环,重新开始

//递归结束条件
if(val==digits.size())
{
//存储
V.push_back(news);
return;
}

梳理递归思路:

代码展示
class Solution
{
//映射关系
string str[10]={"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"};
public:
//递归函数
void Compare(string digits,int val,string news,vector& V)
{
//递归结束条件
if(val==digits.size())
{
//存储
V.push_back(news);
return;
}
//拿到映射内容
int tmp=digits[val]-'0';
string stll=str[tmp];
//从第一个字母开始组合
for(int i=0;isize();++i)
{
//进入第二层for循环
Compare(digits,val+1,news+stll[i],V);
}
}
vector letterCombinations(string digits) 
{
vector V;
if(digits.empty())
{
return V;
}
//调用递归函数
Compare(digits,0,"",V);
//返回结果
return V;
}
};

整型去重

https://leetcode.cn/problems/remove-duplicates-from-sorted-array

原理讲解 

(1)首先我们不管此类去重题有没有序,如果没有,调用Sort函数先排序

(2) 如果本身已经有序,使用:unique+erase 去重组合即可(适用任何类型)

unique 接口作用:

返回一个迭代器,指向去重后序列的末尾(即最后一个不重复元素的下一个位置)

unique 接口参数:

序列范围:begin(),end()

erase 接口作用:

指定删除范围内的元素,并将之后的元素前移

注意:unique 的范围必须有序,且必须保存返回值作为erase的输入范围点

           erase之后迭代器会失效,如果需要重复使用,需要接收erase的返回值

例如:

 代码展示
class Solution {
public:
int removeDuplicates(vector<int>& nums) 
{
auto new_end=unique(nums.begin(),nums.end());
nums.erase(new_end,nums.end());
return nums.size();
}
};

找只出现一次的数字II

https://leetcode.cn/problems/single-number-iii

原理讲解

(1)先算出不同的两个整型的异或结果(比如:1、2、1、3、2、5,异或和结果为6) 

(2)找到找到最低位的1(注意整型溢出)

          int mask = (tmp == INT_MIN ? tmp : tmp & (-tmp));

(3)将最低位为1的进行分组,最后得到只出现一次的两个数字

代码展示
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {//计算异或和
int tmp = 0;
for (auto e : nums)
{
tmp ^= e;
}
//算最低位的1
int mask = (tmp == INT_MIN ? tmp : tmp & (-tmp));
//分组异或
int a = 0;
int b = 0;
for (auto e : nums)
{
if (e & mask)
{
a ^= e;
}
else
{
b ^= e;
}
}
return {a, b};
}
};

只出现一次的数字III

https://leetcode.cn/problems/single-number-iii

原理讲解

 出现3次的数字它的该为加起来至少是3,例如:

代码展示
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
//遍历二进制的每一位
for (int i = 0; i < 32; ++i)
{
int total = 0;
for (auto num: nums)
{
//统计该位1的个数
total += ((num >> i) & 1);
}
//模3去重
if (total % 3)
{
ans |= (1 << i);
}
}
return ans;
}
};
 

                                                  【雾非雾】期待与你的下次相遇! 

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

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

相关文章

20250919_QQ_ICMP

流量分析,ICMP,pysharkTags:流量分析,ICMP,data_len,pyshark 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:20250919_QQ_ICMP.zip 0x01. WP 1. 流量…

手机站点昆明手机网站建设

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生&#xff0c;研究方向为跨语言知识图谱问答。来源&#xff1a;CIKM’2018链接&#xff1a;http://delivery.acm.org/10.1145/3280000/3271704/p247-guan.pdf?ip121.249.15.96&id3271704&accACTIVE%20SERVICE…

福建中江建设公司网站手机会员卡管理系统

文章目录 写在前面Tag题目来源题目解题解题思路方法一&#xff1a;双指针方法二&#xff1a;动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对…

对于做网站有什么要求wordpress恢复主题

一、fprintf 函数描述 fprintf其作用是格式化打印&#xff0c;也叫格式化输出&#xff0c;可以指定输出到一个流文件中&#xff0c;即相输出流中写入数据。fprintf()函数根据指定的格式(format)&#xff0c;向输出流(stream)写入数据(argument)。fprintf( )会根据参数format 字…

Java求职面试:从Spring到微服务的技术挑战 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做团购网站需要什么威海网站建设威海

SpringBoot教程(十五) | SpringBoot集成RabbitMq RabbitMq是我们在开发过程中经常会使用的一种消息队列。今天我们来研究研究rabbitMq的使用。 rabbitMq的官网&#xff1a; rabbitmq.com/ rabbitMq的安装这里先略过&#xff0c;因为我尝试了几次都失败了&#xff0c;后面等我…

2025CSP-S模拟赛59 比赛总结

2025CSP-S模拟赛59T1 T2 T3 T480 WA 20 WA 0 TLE 20 WA总分:120;排名:6/25。 这场比较刺激。T1 其实 A 了,但是忘记特判 \(n=1\) 挂了 20pts。

MCP协议重构AI Agent生态:万能插槽如何终结器具孤岛?

MCP协议重构AI Agent生态:万能插槽如何终结器具孤岛?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

没有网站 可以做cpa高端品牌运动鞋

热点随笔&#xff1a; [歪谈]员工(人才),留得住是因为本身就留得住&#xff1b;留不住的,你永远留不住&#xff08;沈逸&#xff09; 离开北京之前我把过去四年做过的项目的全部源码公开了、需要的联系我、不需要的也欢迎喷水&#xff08;Suzuki.kakeru&#xff09; 关于公司…

佛山专业网站建设团队wordpress 分页404

自动登录脚本参考scrapy爬虫启示录-小伙子老夫看你血气方刚这本《爬虫秘录》就传给你了Scrapy初章-Scrapy理论简介Scrapy次章-啥也不干就是爬图Scrapy第四章-设置代理IP偷偷爬图Scrapy第三章-图片存库MysqlScrapy第五章-多线程加速爬图Scrapy终章-1024福利Scrapy最最最终章-搂一…

管理网站怎么做的网站开发都做些什么

据相关研究报告表明&#xff0c;在众多人工智能落地产品或者应用场景中&#xff0c;智能语音机器人无论从产品的成熟度还是应用的广泛度来说&#xff0c;都是人工智能行业最热门和最有前景的产品。智能语音机器人并不只是一款产品&#xff0c;它是所有智能语音系列产品的统称&a…

濮阳中强网站建设dnf怎么做盗号网站

前几天跟一个做培训的朋友喝茶&#xff0c;聊天期间我问他们公司主要做哪些方面的培训&#xff0c;他笑着说他们公司的业务范围可广了&#xff0c;IT培训&#xff0c;MBA考辅&#xff0c;婴幼儿教育&#xff0c;英语培训......言语中流露出无比的自豪&#xff0c;我最后问了一句…

Principal v6.15 中文汉化版安装教程|Mac .dmg 文件安装步骤详解

Principal v6.15 中文汉化版安装教程|Mac .dmg 文件安装步骤详解​Principal​ 是一款功能实用的 ​Mac 平台工具软件​(具体用途可能因版本不同有所区别,常见于效率工具、系统辅助、设计相关或其他专业用途,根据实…

vulkan游戏引擎的vulkan_utils实现 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

百度自己网站排名公司网站 域名 cn com

转载于:https://www.cnblogs.com/studybrother/p/10109433.html

北京易思腾网站建设博兴县建设局官方网站

目录 1. 系统级编程 2. 游戏开发 3. 嵌入式系统 4. 大数据处理 5. 金融和量化分析 6. 人工智能和机器学习 7. 网络和通信 结语 C是一种多范式编程语言&#xff0c;具有高性能、中级抽象能力和面向对象的特性。由Bjarne Stroustrup于1979年首次设计并实现&#xff0c;C在…

【LUT技术专题】图像自适应3DLUT - 指南

【LUT技术专题】图像自适应3DLUT - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

深入解析:基于51单片机的音乐盒键盘演奏proteus仿真

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站搭建大型公司企业电话查询黄页

目录 set 1基本用法 2Set 实例的属性和方法 3遍历操作 3.1 keys() &#xff0c; values() &#xff0c; entries() 3.2 forEach() 3.3遍历的应用 weakset 含义 语法 总结 set 1基本用法 ES6 提供了新的数据结构 Set。它类似于数组&#xff0c;但是成员的值都是唯一…

完整教程:AugmentFree:解除 AugmentCode 限制的终极方案 如何快速清理vscode和AugmentCode缓存—windows端

完整教程:AugmentFree:解除 AugmentCode 限制的终极方案 如何快速清理vscode和AugmentCode缓存—windows端pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…