📅  最后修改于: 2023-12-03 14:39:39.270000             🧑  作者: Mango
在C++中,高阶函数指的是可以接受一个或多个函数作为参数,并且/或者可以返回一个新函数的函数。这一概念最初来自于函数式编程语言,但在现代C++中也得到了广泛的应用。高阶函数为程序员提供了更简单和灵活的方式来编写复杂的代码,从而提高了代码的可读性和可维护性。
C++11中引入了lambda表达式,这是一种匿名函数,它可以在任何地方定义并传递给高阶函数。下面是一个简单的例子,演示如何使用lambda表达式在vector中过滤元素:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9};
auto is_even = [](int x) { return x % 2 == 0; };
std::vector<int> even_vec;
std::copy_if(vec.begin(), vec.end(), std::back_inserter(even_vec), is_even);
for (const auto& x : even_vec) {
std::cout << x << " ";
}
std::cout << std::endl;
}
上面的代码在vector中使用了std::copy_if
算法,该算法接受一个范围和一个函数,并且将范围中满足指定条件的元素存储到输出迭代器中。is_even
是一个lambda表达式,用于检查vector中的元素是否为偶数。在我们的示例中,is_even
将被传递给std::copy_if
,并且只会将偶数元素存储到输出迭代器中。
C++中的函数对象是一种特殊的对象,其行为类似于函数。与lambda表达式不同,函数对象可以包含状态,因此它们可以在多个函数调用之间保存状态信息。下面是一个简单的函数对象示例,演示如何将给定值添加到向量中的每个元素:
#include <iostream>
#include <vector>
struct add_value {
int value;
add_value(int value) : value(value) {}
int operator()(int x) const { return x + value; }
};
int main() {
std::vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9};
int value = 10;
std::transform(vec.begin(), vec.end(), vec.begin(), add_value(value));
for (const auto& x : vec) {
std::cout << x << " ";
}
std::cout << std::endl;
}
在这个示例中,add_value
是一个函数对象,它包含一个成员变量value
,并且通过函数调用符()
定义了一个操作符。这个操作符接受一个整数,并将它与value
相加。在main
函数中,我们使用标准算法std::transform
,以将add_value
对象的调用作为元素的transformation函数应用于vector中的每个元素。这将向每个元素添加10,因此输出将为11,12,13,14,15,16,17,18,19。
C++11中的std::function
类是一个模板类,它可以包装任何可调用对象,包括函数、函数指针、lambda表达式和函数对象。下面是一个示例,演示如何使用std::function
来实现一个简单的计算器:
#include <functional>
#include <iostream>
#include <string>
int add(int x, int y) { return x + y; }
int subtract(int x, int y) { return x - y; }
int multiply(int x, int y) { return x * y; }
int divide(int x, int y) { return x / y; }
int main() {
std::function<int(int, int)> op;
std::string op_str;
int x, y;
std::cout << "Enter an operation and two numbers: ";
std::cin >> op_str >> x >> y;
if (op_str == "+") {
op = add;
} else if (op_str == "-") {
op = subtract;
} else if (op_str == "*") {
op = multiply;
} else if (op_str == "/") {
op = divide;
} else {
std::cerr << "Invalid operation." << std::endl;
return 1;
}
std::cout << op(x, y) << std::endl;
}
在这个示例中,我们首先定义了一个std::function
对象op
,将其声明为一个参数为两个整数,返回一个整数的函数。然后,我们使用std::cin
从控制台读取运算符和两个整数。在读取运算符之后,我们使用条件语句来检查所选的操作符,并将op
设置为相应的函数。最后,我们在std::cout
中调用op
来计算所需的值。
C++中的高阶函数可以帮助程序员编写更简单、灵活、可读性和可维护性更高的代码。本文介绍了lambda表达式、函数对象和std::function
都是实现高阶函数的主要手段。无论您是正在开发一个小型脚本还是一个大型应用程序,高阶函数都是您需要掌握的一种技术。