当前位置: 首页 > news >正文

C++20 统一容器擦除:std::erase 和 std::erase_if

文章目录

    • 一、`std::erase` 的用法
      • 1.1 语法
      • 1.2 参数
      • 1.3 返回值
      • 1.4 示例
    • 二、`std::erase_if` 的用法
      • 2.1 语法
      • 2.2 参数
      • 2.3 返回值
      • 2.4 示例
    • 三、优势与应用场景
      • 3.1 统一的接口
      • 3.2 简化代码
      • 3.3 适用范围广
    • 四、总结

C++20 引入了两个非常实用的函数模板: std::erasestd::erase_if,它们为容器操作提供了更简洁、统一的接口,极大地简化了容器元素的删除操作。

一、std::erase 的用法

std::erase 用于从容器中删除所有与指定值匹配的元素。它适用于所有标准容器,如 std::vectorstd::liststd::map 等。

1.1 语法

template<class Container, class T>
constexpr auto erase(Container& c, const T& value);

1.2 参数

  • c:要操作的容器。
  • value:要删除的元素值。

1.3 返回值

返回删除的元素数量。

1.4 示例

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5, 3, 6};
    auto erased_count = std::erase(vec, 3); // 删除所有值为3的元素
    std::cout << "Erased " << erased_count << " elements.\n";
    for (int i : vec) {
        std::cout << i << " ";
    }
    return 0;
}

输出:

Erased 2 elements.
1 2 4 5 6

二、std::erase_if 的用法

std::erase_if 用于从容器中删除满足特定条件的元素。

2.1 语法

template<class Container, class Predicate>
constexpr auto erase_if(Container& c, Predicate pred);

2.2 参数

  • c:要操作的容器。
  • pred:谓词函数,返回 true 表示该元素应被删除。

2.3 返回值

返回删除的元素数量。

2.4 示例

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5, 6};
    auto erased_count = std::erase_if(vec, [](int x) { return x % 2 == 0; }); // 删除所有偶数
    std::cout << "Erased " << erased_count << " elements.\n";
    for (int i : vec) {
        std::cout << i << " ";
    }
    return 0;
}

输出:

Erased 3 elements.
1 3 5

三、优势与应用场景

3.1 统一的接口

std::erasestd::erase_if 提供了统一的接口,使得对不同容器的删除操作更加一致。这减少了开发者对不同容器成员函数的依赖,降低了学习成本。

3.2 简化代码

使用 std::erasestd::erase_if 可以避免手动使用迭代器进行删除操作,简化了代码。例如,std::erase_if 可以替代 std::remove_iferase 的组合,减少了代码量。

3.3 适用范围广

这两个函数适用于所有标准容器,包括 std::vectorstd::liststd::map 等。这使得它们在处理不同类型容器时更加通用。

四、总结

C++20 的 std::erasestd::erase_if 为容器操作提供了更简洁、统一的接口。它们不仅简化了代码,还减少了开发者对不同容器成员函数的依赖。在实际开发中,这两个函数可以显著提高代码的可读性和可维护性。

相关文章:

  • 大厂算法面试 7 天冲刺:第7天-系统设计与模拟面试实战 —— 架构思维 + Java落地
  • Git 拉取时常见冲突及解决方法总结
  • MySQL---数据库基础
  • 封装公共方法,并存在异步请求接口情况 封装及调用
  • vue keep-alive 如何设置动态的页面缓存
  • Python | kelvin波的水平空间结构
  • [MySQL]复合查询
  • 408 计算机网络 知识点记忆(7)
  • 基于phpStudy/宝塔搭建pbootcms,用于公司官网 | 解决管理后台登录报错问题 runtime\\data\\xx.php
  • 一文详解ffmpeg环境搭建:Ubuntu系统ffmpeg配置nvidia硬件加速
  • 2.2.3 Spark Standalone集群
  • 各类神经网络学习:(十)注意力机制(第2/4集),pytorch 中的多维注意力机制、自注意力机制、掩码自注意力机制、多头注意力机制
  • 游戏盾IP可以被破解吗
  • [特殊字符] macOS + Lima 离线下载 Calico 镜像教程
  • UML-饮料自助销售系统(饮料已售完)序列图
  • 每日一题-力扣-2999. 统计强大整数的数目 0410
  • 预言机与数据聚合器:DeFi的数据桥梁与风险博弈
  • 云原生运维在 2025 年的发展蓝图
  • PyTorch实现多输入输出通道的卷积操作
  • 非 root 用户运行 Docker 容器和同步主机和容器权限
  • php网站后台无法上传图片/微信公众号推广软文案例
  • 公司做网站的费用怎么记账/推广app赚佣金平台有哪些
  • 网站前端开发/推销网站
  • 长葛做网站/网站优化排名方案
  • 无锡网站营销推广/广告免费推广网
  • 怎么样做门户网站/google收录查询