首页/新闻资讯/正文详情

C++ vector 删除元素:erase-remove 惯用法与迭代器陷阱

发布时间:2026/9/27 18:15:30 来源:云帆数科 栏目:资讯中心
C++ vector 删除元素:erase-remove 惯用法与迭代器陷阱
vector 删除元素erase-remove 惯用法1. 问题背景2. std::remove 实际做了什么3. erase-remove 惯用法4. C20 的更简洁写法5. 遍历时删除元素6. 删除多个元素的性能7. 常见误区8. 一页速查9. 总结1. 问题背景在 vector 中删除满足条件的元素看起来像一个简单操作但初学时很容易误解 std::remove。它的名字叫 remove却不会真正改变容器大小。2. std::remove 实际做了什么std::remove 会把需要保留的元素移动到区间前部并返回新的“逻辑结尾”。尾部仍然存在只是内容处于未指定状态。#includealgorithm#includevectorstd::vectorintvalues{1,0,2,0,3};autonewEndstd::remove(values.begin(),values.end(),0);执行后 values.size() 仍然是 5。要真正缩短容器还需要 erase。3. erase-remove 惯用法values.erase(std::remove(values.begin(),values.end(),0),values.end());这段代码分两步remove 把保留元素移到前面erase 删除从新逻辑结尾到真实结尾的元素。按条件删除时使用 remove_ifvalues.erase(std::remove_if(values.begin(),values.end(),[](intx){returnx0;}),values.end());4. C20 的更简洁写法C20 为常用容器提供了 std::erase 和 std::erase_if。std::erase(values,0);std::erase_if(values,[](intx){returnx0;});表达更直接也不容易忘记第二步 erase。5. 遍历时删除元素需要边遍历边删除时使用 erase 的返回值继续迭代。for(autoitvalues.begin();it!values.end();){if(*it%20){itvalues.erase(it);}else{it;}}vector::erase 会让删除位置及其后的迭代器、引用和指针失效因此不能继续使用旧 it也不要在 erase 后无条件再 it。6. 删除多个元素的性能循环中反复调用 erase 可能多次移动后续元素最坏情况下成本很高。如果删除条件可以一次判断erase-remove 或 erase_if 通常更高效因为保留元素只需集中移动。如果不要求保持原顺序还可以用“与末尾交换再 pop_back”的方式进行 O(1) 单次删除values[index]std::move(values.back());values.pop_back();这种方法会改变元素顺序只适合顺序不重要的场景。7. 常见误区只调用 remove误以为 size 会变小erase 后继续使用已经失效的迭代器在范围 for 中直接删除 vector 元素不考虑是否需要保持元素原顺序。8. 一页速查场景推荐写法删除指定值C11erase(remove(…), end())按条件删除C11erase(remove_if(…), end())删除指定值C20std::erase(container, value)按条件删除C20std::erase_if(container, pred)遍历中删除it container.erase(it)9. 总结std::remove 只调整元素位置不负责缩小容器真正删除要配合 erase。C20 可优先使用 std::erase 和 std::erase_if。遍历中删除时必须接住 erase 返回的新迭代器并牢记 vector 的迭代器失效规则。

相关推荐

动态Js文件做网站标题怎么选,避开这3个坑能省一半钱
动态Js文件做网站标题怎么选,避开这3个坑能省一半钱

动态Js文件做网站标题怎么选,避开这3个坑能省一半钱 很多甲方朋友在沟通建站需求时,第一反应往往是:“我域名买好了,服务器选哪个?预算怎么算?”这种对底层架构的迷茫,直接导致了后续沟通成本的飙升。其实, 域名服务器搞不懂… · 2026/9/27 18:15:23

Vscode插件离线安装教程:vsix 手动装 + 中文插件安装失败排查与 TaoToken 配置骨架
Vscode插件离线安装教程:vsix 手动装 + 中文插件安装失败排查与 TaoToken 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 18:15:23

【AI 编程助手】DevChat 实战配置:VS Code 接入 TaoToken 与代码审计案例全流程
【AI 编程助手】DevChat 实战配置:VS Code 接入 TaoToken 与代码审计案例全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 18:15:23

游标卡在 Cline 里不动?用 TaoToken 统一 Key 通道排查 settings.json 配置
游标卡在 Cline 里不动?用 TaoToken 统一 Key 通道排查 settings.json 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 18:50:58

Oracle 游标 for 与 fetch 配 TaoToken:settings.json 骨架与报错排查
Oracle 游标 for 与 fetch 配 TaoToken:settings.json 骨架与报错排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 18:50:58

智能家居的新大脑:用 TaoToken 统一 Key 搭建 AI Agent Harness Engineering 控制中心
智能家居的新大脑:用 TaoToken 统一 Key 搭建 AI Agent Harness Engineering 控制中心

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 18:50:52

School of SRE 的 Python 语言内功课:从对象模型、字节码到装饰器的机制全解
School of SRE 的 Python 语言内功课:从对象模型、字节码到装饰器的机制全解

教程 【免费下载链接】school-of-sre At LinkedIn, we are using this curriculum for onboarding our entry-level talents into the SRE role. 项目地址: https://gitcode.com/gh_mirrors/sc/school-of-sre 点击查看 免费下载 Python 是 SRE 日常脚本、运维工具与… · 2026/9/27 18:50:52

一句话生成3D动作:Kimodo文本到动作(文字驱动)从零上手教程
一句话生成3D动作:Kimodo文本到动作(文字驱动)从零上手教程

一句话生成3D动作:Kimodo文本到动作(文字驱动)从零上手教程 【免费下载链接】kimodo Official implementation of Kimodo, a kinematic motion diffusion model for high-quality human(oid) motion generation. 项目地址: https://gitcode.com/gh_mirrors/ki/kim… · 2026/9/27 18:50:52

CodeX 与 ClaudeCode 接入 Kimi K3:API Key 与 chat completions 配置实战
CodeX 与 ClaudeCode 接入 Kimi K3:API Key 与 chat completions 配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 18:50:40

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码