📜  C ++中的高阶函数(1)

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

C++中的高阶函数

在C++中,高阶函数指的是可以接受一个或多个函数作为参数,并且/或者可以返回一个新函数的函数。这一概念最初来自于函数式编程语言,但在现代C++中也得到了广泛的应用。高阶函数为程序员提供了更简单和灵活的方式来编写复杂的代码,从而提高了代码的可读性和可维护性。

lambda表达式

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。

std::function

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都是实现高阶函数的主要手段。无论您是正在开发一个小型脚本还是一个大型应用程序,高阶函数都是您需要掌握的一种技术。