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

文章目录

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

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

一、std::erase 的用法

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

1.1 语法

cpp 复制代码
template<class Container, class T>
constexpr auto erase(Container& c, const T& value);

1.2 参数

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

1.3 返回值

返回删除的元素数量。

1.4 示例

cpp 复制代码
#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 语法

cpp 复制代码
template<class Container, class Predicate>
constexpr auto erase_if(Container& c, Predicate pred);

2.2 参数

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

2.3 返回值

返回删除的元素数量。

2.4 示例

cpp 复制代码
#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 为容器操作提供了更简洁、统一的接口。它们不仅简化了代码,还减少了开发者对不同容器成员函数的依赖。在实际开发中,这两个函数可以显著提高代码的可读性和可维护性。

相关推荐
啦啦啦啦啦zzzz3 天前
利用RAII机制进行日志的采集
linux·服务器·c++·网络编程·c++20
啦啦啦啦啦zzzz4 天前
Logger的组装(c++20)
c++·算法·c++20
啦啦啦啦啦zzzz7 天前
Appender抽象类的实现c++20
linux·服务器·c++·c++20
OPEN-F10 天前
C++20新特性精讲:概念、范围与三路比较
算法·c++20
小小龙学IT18 天前
C++ std::chrono 时间库深度解析:从 duration 模板到 C++20 日历与时区
linux·c++·c++20
郝学胜-神的一滴20 天前
C++20 高级编程 004:从初始化、内存到const系列关键字
开发语言·算法·编程·软件构建·c++20
可爱系程序猿20 天前
msvcp120.dll 加载失败排查:VC++ 2013、进程架构与插件私有目录如何对应
程序人生·电脑·c++20
ShineWinsu20 天前
对于C++:C++20中线程、初始化、Lambda与内存视图等特性的解析
c++·c++20
可爱系程序猿21 天前
mfc100.dll 加载失败排查:旧版 VC++ 2010 程序、位数与插件目录如何核对
程序人生·电脑·c++20
ShineWinsu24 天前
对于 C++:C++20中Concept(概念) 与 Coroutine(协程)的解析
linux·开发语言·网络·c++·c++20·epoll