STL std::copy_if()算法:复制满足条件的算法
STL std::copy_if算法介绍
·
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这样的插入迭代器,它会自动扩展目标容器。 - 谓词函数不应修改元素,因为它的目的是基于元素的当前值判断是否需要复制。
所有评论(0)