新闻中心

C++ vector如何高效删除元素_C++ remove_if与erase惯用法演示

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

c++ vector如何高效删除元素_c++ remove_if与erase惯用法演示

在C++中,使用std::vector时删除元素是一个常见需求。直接遍历并删除会导致性能问题甚至迭代器失效。最高效且安全的方法是结合eraseremove_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妙多

Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”

Motiff妙多 334 查看详情 Motiff妙多
#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&#215;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浏览器启动后显示白屏的解决教程 

搜索