在C++中,我们可以使用函数对象(也称为仿函数)和lambda表达式来处理多种过滤条件。这里有一个示例,展示了如何使用这些技术来过滤一个整数向量,根据多个条件(例如,大于10且为偶数)。
#include <iostream>
#include <vector>
#include <algorithm>
bool is_even(int num) {
return num % 2 == 0;
}
bool is_greater_than_ten(int num) {
return num > 10;
}
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
// 使用函数对象进行过滤
std::vector<int> filtered_numbers1;
std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(filtered_numbers1), is_even);
std::copy_if(filtered_numbers1.begin(), filtered_numbers1.end(), std::back_inserter(filtered_numbers1), is_greater_than_ten);
// 使用lambda表达式进行过滤
std::vector<int> filtered_numbers2;
std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(filtered_numbers2), [](int num) {
return num % 2 == 0 && num > 10;
});
// 输出过滤后的结果
std::cout << "Filtered numbers using function objects:" << std::endl;
for (int num : filtered_numbers1) {
std::cout << num << " ";
}
std::cout << std::endl;
std::cout << "Filtered numbers using lambda expressions:" << std::endl;
for (int num : filtered_numbers2) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
在这个示例中,我们首先定义了两个简单的函数对象is_even
和is_greater_than_ten
,分别用于检查一个整数是否为偶数以及是否大于10。然后,我们使用std::copy_if
算法和这些函数对象来创建一个过滤后的向量filtered_numbers1
。
接下来,我们展示了如何使用lambda表达式来实现相同的过滤条件。Lambda表达式是一种更简洁的方式来定义函数对象,它允许我们在不创建单独的函数对象的情况下定义一个简单的匿名函数。在这个例子中,我们使用了一个lambda表达式来检查一个整数是否既是偶数又大于10,并将满足条件的整数添加到filtered_numbers2
向量中。
最后,我们输出过滤后的结果,可以看到两种方法都得到了相同的结果:12和14。