新闻中心
C++ vector如何高效删除元素_C++ remove_if与erase惯用法演示
使用erase-remove惯用法可安全高效删除vector元素。直接循环erase会导致迭代器失效和元素移动,引发未定义行为;而std::remove_if将不满足条件的元素前移并返回新末尾迭代器,再由erase删除冗余部分,仅遍历一次,时间复杂度O(n),适用于基本类型和自定义类型,如按条件删除User对象,是标准且推荐的做法。

在C++中,使用std::vector时删除元素是一个常见需求。直接遍历并删除会导致性能问题甚至迭代器失效。最高效且安全的方法是结合erase和remove_if算法,这就是所谓的“erase-remove”惯用法。
为什么不能直接循环删除?
若在for循环中调用vector::erase(),每次删除都会移动后续元素,导致迭代器失效,还可能跳过元素或访问非法内存。例如:
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
if (*it % 2 == 0) {
vec.erase(it); // 错误!it失效后继续使用
}
}
erase-remove 惯用法原理
std::remove_if并不真正删除元素,而是将不满足条件的元素前移,并返回一个指向新逻辑末尾的迭代器。再用vector::erase()从该位置删除到实际末尾,完成物理删除。
这种做法只进行一次元素移动,效率高且安全。
使用 remove_if + erase 删除满足条件的元素
以下示例删除vector中所有偶数:
Motiff妙多
Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”
334
查看详情
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5, 6};
// 删除所有偶数
vec.erase(
std::remove_if(vec.begin(), vec.end(),
[](int n) { return n % 2 == 0; }
),
vec.end()
);
// 输出结果:1 3 5
for (int n : vec) {
std::cout << n << " ";
}
return 0;
}
说明:
-
std::remove_if把奇数移到前面,返回指向新结尾的迭代器 -
vec.erase()删除从新结尾到原结尾之间的冗余元素 - 时间复杂度为 O(n),仅遍历一次
处理自定义类型
对于类对象,比如删除名字为空的用户:
struct User {
std::string name;
int age;
};
std::vector<User> users = {{"Alice", 25}, {"", 30}, {"Bob", 20}};
users.erase(
std::remove_if(users.begin(), users.end(),
[](const User& u) { return u.name.empty(); }
),
users.end()
);
这样就清除了所有name为空的User对象。
基本上就这些。只要记住:删除vector中符合条件的元素,优先使用erase(remove_if(...))惯用法,避免手动循环erase。安全、简洁、高效。
以上就是C++ vector如何高效删除元素_C++ remove_if与erase惯用法演示的详细内容,更多请关注其它相关文章!
# ai
# go
# 自定义
# 都是
# 遍历
# 迭代
# 为什么
# stream
# ios
# c++
# 徐州城市建设规划网站
# 同安网站优化哪家好
# 网站建设销售新人工资
# 网站推广点击率多少正常
# 医学技术专业网站建设
# 清远网站竞价推广代运营
# 沈阳优化网站哪家专业
# 邯郸网站建设多少费用啊
# 网站建设软件工程大学
# PPT模板网站建设管理
# 多路
# 管理机制
# 为空
# 如何实现
# 何为
# 将不
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句
深入理解与实现最大堆的Heapify过程:常见错误与修正
Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐
J*aScript Promise链中如何正确终止后续.then执行并处理错误
海棠账号登录入口_登录海棠账户同步阅读记录
优化大型XML文件解析:基于Python流式处理的内存高效方案
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
如何在网页中实现特定地点的随机图片展示
Python实时数据流中的动态最值查找策略
解决深度学习模型训练初期异常高损失与完美验证准确率问题
J*aScript实现动态背景色下的文本与按钮颜色自适应调整
css绝对定位元素脱离父容器怎么办_确保父元素position非static
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
Win11怎么关闭快速启动_Win11彻底关机设置教程
QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网
J*a应用集成GitHub CLI与API认证指南
微信客户端如何收红包_微信客户端接收红包使用教程
C++如何生成随机数_C++ random库使用方法与范围设置
必由学登录入口 必由学官方网站在线访问链接
Promise错误处理:在catch后终止链式then执行的策略
在VS Code中配置和运行Dart程序的完整步骤
2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC
天猫2025双十一0点秒杀攻略 天猫爆款抢购时间
如何提高微信支付的安全性_微信支付安全防护与设置建议
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
小红书网页版入口链接分享 小红书官网直接进
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
jQuery Mask 插件中实现电话号码固定前导零的教程
XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法
如何有效阻止外部脚本意外修改内联样式的高度属性
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
Go语言HTML解析:利用Goquery精准获取指定元素内容
天眼查企业查询官网入口 天眼查官方网页版查询
J*a递归快速排序中静态变量的状态管理与陷阱
必由学网页版入口 必由学官方平台直接访问
妖精动漫免费平台 妖精动漫官网资源观看网址
如何使用 Excel 发布器与 Power BI 分享 Excel 洞察
圆通快递查询实时追踪 圆通物流包裹状态快速查看
Pygame教程:解决用户输入与游戏状态更新不同步问题
如何在Promise链中优雅地中断后续then执行
Django模型中自动计算可用余额的实现方法
深入理解J*a编译器的兼容性选项:从-source到--release
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
Lar*el头像管理:图片缩放与旧文件删除的最佳实践
Yandex免登录网页版地址 Yandex搜索引擎官方访问入口
优化HTML表单样式:解决输入框焦点跳动与元素间距问题
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程


2025-11-26
浏览次数:次
返回列表