0

0

C++ 怎么删除vector特定元素 C++ remove_if结合lambda表达式【高阶】

冰火之心

冰火之心

发布时间:2026-02-03 16:31:38

|

265人浏览过

|

来源于php中文网

原创

std::remove_if 不真正删除元素,仅重排保留元素并返回新逻辑尾迭代器;需配合 erase 才能真正移除并收缩容器。

c++ 怎么删除vector特定元素 c++ remove_if结合lambda表达式【高阶】

remove_if 为什么不能直接删掉元素

std::remove_if 实际上不删除任何元素,它只是把“要保留”的元素往前挪,返回一个指向新逻辑尾部的迭代器。原 vector 大小不变,后面是未定义值(或旧值)。真正删掉内存空间,得配合 erase —— 这就是经典的 erase-remove 惯用法。

常见错误是只调用 remove_if 就以为删完了,结果 size() 没变,遍历时还可能访问到残留数据。

  • 必须写成 v.erase(remove_if(v.begin(), v.end(), pred), v.end())
  • pred 是可调用对象,lambda 最常用,捕获方式要小心(比如引用捕获局部变量时,确保 lambda 生命周期不超出生命周期)
  • 如果 vector 存的是指针或智能指针,remove_if 只搬指针,不释放所指对象

lambda 捕获外部变量删指定值

想删掉所有等于某个变量 target 的元素?直接在 lambda 中用 [target] 值捕获最安全:

int target = 42;
vec.erase(remove_if(vec.begin(), vec.end(), [target](const int& x) { return x == target; }), vec.end());

target 是大对象(如 std::string),建议用 [&target] 引用捕获避免拷贝;但务必确认 target 在整个 erase-remove 过程中有效(比如别在 lambda 外提前销毁)。

立即学习C++免费学习笔记(深入)”;

  • 不要写 [=] 捕获全部,容易意外拷贝不需要的变量,也模糊意图
  • 如果要删满足复合条件的元素(如“大于 10 且是偶数”),lambda 主体里写清楚逻辑,别硬塞进一行
  • 注意 const 正确性:参数用 const T& 避免不必要的拷贝,尤其对非 POD 类型

删满足自定义类成员条件的元素

假设 vector,想删掉所有 age 的人,lambda 直接访问成员即可:

魔匠AI论文
魔匠AI论文

专业原创的AI论文写作工具,一站式解决论文选题、写作、文献综述、答辩PPT全流程,支持毕业论文、课程论文等多种类型,轻松助力高质量论文写作。

下载
people.erase(remove_if(people.begin(), people.end(), [](const Person& p) { return p.age < 18; }), people.end());

但如果需要根据外部状态判断(比如删掉 name黑名单里的),就得捕获黑名单容器:

  • [&blacklist] 引用捕获 unordered_set,查起来快
  • 若黑名单是临时构造的,改用 [blacklist = std::move(tmp)] 转移所有权
  • 别在 lambda 里修改捕获的容器(除非明确加 mutable,且知道线程安全风险)

性能和迭代器失效要注意什么

remove_if + erase 是 O(n) 时间、O(1) 额外空间,比循环中反复调用 erase(每次删都移动后面所有元素,最坏 O(n²))高效得多。

但要注意:

  • 过程中所有指向被“挪走”元素的迭代器、指针、引用都会失效(即使没被删,位置也变了)
  • 如果删完还要继续用某些元素的指针,得在 remove_if 前保存它们的值或索引,而不是地址
  • vector> 场景下,remove_if 会移动 unique_ptr,自动转移所有权,原位置变成空,这是安全的

最易忽略的是:lambda 里抛异常会导致 remove_if 行为未定义(标准不保证强异常安全),所以 predicate 内尽量别抛,或确保它 noexcept

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

543

2023.08.02

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

534

2023.09.20

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

191

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

57

2026.01.05

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

568

2023.08.10

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

4

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

8

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

6

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 8.4万人学习

C 教程
C 教程

共75课时 | 4.4万人学习

C++教程
C++教程

共115课时 | 15.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号