STL std::copy_if算法:复制满足条件的算法

std::copy_if 是 C++ 标准库中的一个算法,定义在 <algorithm> 头文件中。它用于从源范围复制满足特定条件的元素到目标范围。这个函数允许你基于一个给定的谓词(predicate,即条件函数)选择性地复制元素,这对于过滤数据或者提取满足某些条件的数据子集非常有用。

函数原型

std::copy_if 的函数原型如下:

template< class InputIt, class OutputIt, class UnaryPredicate >
OutputIt copy_if(InputIt first, InputIt last, OutputIt d_first, UnaryPredicate pred);
  • InputIt first, InputIt last:定义了一个输入范围的开始和结束迭代器,[first, last) 是源范围,从中复制元素。
  • OutputIt d_first:目标范围的开始迭代器,指向复制结果的起始位置。
  • UnaryPredicate pred:一个一元谓词,用于测试元素是否应该被复制。谓词应当接受从输入范围中的元素类型转化来的一个参数,并返回一个能被转换为bool的值。如果谓词对元素返回true,该元素会被复制到目标范围。

返回值

std::copy_if 返回一个迭代器,指向目标范围中最后一个被复制元素之后的位置。

示例代码

下面是一个使用 std::copy_if 的简单例子,从一个整数向量中复制所有偶数到另一个向量中:

#include <algorithm> // std::copy_if
#include <vector>
#include <iostream>
int main() {
    std::vector<int> src = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::vector<int> dest;
    // 预分配足够的空间以避免多次内存分配
    dest.reserve(src.size());
    // 复制所有偶数到dest
    std::copy_if(src.begin(), src.end(), std::back_inserter(dest),
                 [](int i){ return i % 2 == 0; });
    // 输出结果
    for(int n : dest) {
        std::cout << n << ' ';
    }
    return 0;
}

在这个例子中,std::copy_if 使用了一个 lambda 表达式作为谓词,来检查每个元素是否是偶数。满足条件(即谓词返回true)的元素被复制到dest向量中。

注意事项

  • 目标范围应该有足够的空间来接收所有被复制的元素。如果不确定,可以使用如std::back_inserter这样的插入迭代器,它会自动扩展目标容器。
  • 谓词函数不应修改元素,因为它的目的是基于元素的当前值判断是否需要复制。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。