c++如何删除vector中的指定元素_c++ vector erase用法【实战】

发布时间 - 2026-01-24 00:00:00    点击率:
vector::erase 删除单个元素需配合迭代器,不能直接传值;正确做法是先用 std::find 查找再 erase,并检查迭代器有效性;批量删用 remove-erase 惯用法;按条件删用 remove_if;注意迭代器失效与性能陷阱。

vector::erase 删除单个元素要配合迭代器使用

直接用 erase 删除某个值(比如数字 5)会失败,因为 erase 不接受值参数,只接受迭代器。常见错误是写成 v.erase(5),这会删掉第 5 个位置的元素,不是值为 5 的元素。

正确做法是先用 std::find 找到目标值的迭代器,再传给 erase

auto it = std::find(v.begin(), v.end(), 5);
if (it != v.end()) {
    v.erase(it);
}
  • 必须检查 it != v.end(),否则对未找到的 end() 调用 erase 是未定义行为
  • erase 返回被删除元素后一个位置的迭代器(C++11 起),可用来继续遍历,但单删时通常不需要
  • 删除后,原迭代器失效,后续不能再用 it 访问或递增

一次性删除所有匹配值要用 remove-erase 惯用法

想删掉 vector 中所有值为 5 的元素?不能循环调用 find + erase,因为每次 erase 都会移动后续元素,导致迭代器失效、漏删或越界。

标准解法是 std::remove + erase 组合:

v.erase(std::remove(v.begin(), v.end(), 5), v.end());
  • std::remove 不真正删除,只是把不匹配的元素前移,并返回新逻辑结尾的迭代器
  • erase 接收这个迭代器和 v.end(),批量擦除“被覆盖”区域(即原末尾多余部分)
  • 该操作时间复杂度 O(n),只遍历一次,比反复查找+删除高效且安全

按条件删除(比如大于 10 的元素)得用 remove_if

当删除逻辑无法用等值判断(如“删掉所有偶数”“删掉长度小于 3 的字符串”),就得换 std::remove_if

v.erase(std::remove_if(v.begin(), v.end(), [](int x) { return x > 10; }), v.end());
  • lambda 或函数对象返回 true 的元素会被“移走”,最终由 erase 清理
  • 注意:remove_if 同样不改变容器大小,必须配 erase 才真正收缩内存
  • 如果需要保留原始顺序,这个方法天然满足;若顺序无关,有时用反向遍历 + 单次 erase 更直观(但 remove_if 更通用)

删除时要注意迭代器失效和性能陷阱

erase 对 vector 来说开销不小——它会把被删元素之后的所有元素向前复制。频繁在头部或中间删除,性能会明显下降。

  • 在尾部删除用 pop_back(),O(1),不涉及移动
  • 需高频随机删除时,考虑换 std::liststd::deque(但失去随机访问)
  • 用索引循环删除(如 for(int i=0; i
  • 用正向迭代器循环删除也危险,除非你手动管理迭代器(如 it = v.erase(it)),但不如 remove-erase 简洁可靠

真正容

易被忽略的是:vector 删除不会自动释放多余内存,容量(capacity())不变。如果删了大量元素又不再添加,可以用 std::vector(v).swap(v) 或 C++11 的 v.shrink_to_fit()(后者是请求,不保证成功)来回收内存。


# c++  # for  # 字符串  # int  # 循环  # Lambda  # 值参数  # 对象  # 迭代  # 遍历  # 先用  # 值为  # 的是  # 不需要  # 可以用  # 要用  # 就得  # 又不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  清除minerd进程的简单方法  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何在IIS管理器中快速创建并配置网站?  如何在阿里云ECS服务器部署织梦CMS网站?  Linux系统命令中screen命令详解  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  javascript基于原型链的继承及call和apply函数用法分析  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  高端企业智能建站程序:SEO优化与响应式模板定制开发  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  高端建站三要素:定制模板、企业官网与响应式设计优化  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel如何为API生成Swagger或OpenAPI文档  常州企业网站制作公司,全国继续教育网怎么登录?  如何在Ubuntu系统下快速搭建WordPress个人网站?  在线教育网站制作平台,山西立德教育官网?  在线制作视频的网站有哪些,电脑如何制作视频短片?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel如何使用withoutEvents方法临时禁用模型事件  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  网站图片在线制作软件,怎么在图片上做链接?  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Python高阶函数应用_函数作为参数说明【指导】  如何在IIS7上新建站点并设置安全权限?  网站优化排名时,需要考虑哪些问题呢?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  非常酷的网站设计制作软件,酷培ai教育官方网站?  公司门户网站制作流程,华为官网怎么做?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  node.js报错:Cannot find module 'ejs'的解决办法  西安专业网站制作公司有哪些,陕西省建行官方网站?  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel如何使用Sanctum进行API认证?(SPA实战)  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】