📜  c++ 擦除(remove_if) - C++ (1)

📅  最后修改于: 2023-12-03 14:39:55.445000             🧑  作者: Mango

C++ 擦除(remove_if)

C++ stl库提供了许多方便快捷的算法来处理容器数据,其中一个非常常用的算法是 remove_if,用于从容器中删除满足某个条件的元素。

函数签名
template< class ForwardIt, class UnaryPredicate >
ForwardIt remove_if( ForwardIt first, ForwardIt last, UnaryPredicate p );

其中,ForwardIt 表示容器迭代器类型,UnaryPredicate 表示一个返回值为 bool 类型的函数对象,判断容器中的元素是否需要删除。

函数调用后会将容器中满足条件的元素移动到容器尾部,返回值是指向最后一个不需要删除的元素的迭代器,需要自行调用容器的 erase 函数删除尾部的无用元素。

示例代码

下面是一个使用 remove_if 的例子,假设我们有一个 vector<int> 容器,需要删除其中的偶数元素。

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    // 初始化 vector
    std::vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9};

    // 使用 remove_if 删除偶数元素
    vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i){return i%2==0;}), vec.end());

    // 输出删除后的 vector
    for (int i : vec)
        std::cout << i << " ";
    std::cout << std::endl;

    return 0;
}

输出结果为:

1 3 5 7 9
注意事项
  • remove_if 只会将满足条件的元素移到容器尾部,而不是真正删除,需要再次调用容器的 erase 函数才能删除无用的元素。
  • remove_if 的默认实现使用的是复制移动语义,因此如果容器中存在复杂类类型,需要自定义析构函数(如释放内存等)时需要注意。