《高阶函数:把函数当玩具传来传去》

C++中的高阶函数

高阶函数是指可以接受其他函数作为参数或返回函数作为结果的函数。在C++中,有几种方式可以实现高阶函数的功能:

1. 函数指针

cpp 复制代码
#include <iostream>

int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }

// 高阶函数,接受函数指针作为参数
int compute(int x, int y, int (*op)(int, int)) {
    return op(x, y);
}

int main() {
    std::cout << compute(5, 3, add) << std::endl;      // 输出 8
    std::cout << compute(5, 3, subtract) << std::endl; // 输出 2
    return 0;
}

2. 函数对象(仿函数)

cpp 复制代码
#include <iostream>

// 函数对象类
struct Adder {
    int operator()(int a, int b) const {
        return a + b;
    }
};

struct Multiplier {
    int operator()(int a, int b) const {
        return a * b;
    }
};

// 高阶函数模板,接受函数对象
template <typename Operation>
int compute(int x, int y, Operation op) {
    return op(x, y);
}

int main() {
    std::cout << compute(5, 3, Adder()) << std::endl;       // 输出 8
    std::cout << compute(5, 3, Multiplier()) << std::endl;  // 输出 15
    return 0;
}

3. Lambda表达式(C++11及以上)

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>

// 高阶函数,接受lambda作为参数
void forEach(const std::vector<int>& values, void (*func)(int)) {
    for (int value : values) {
        func(value);
    }
}

int main() {
    std::vector<int> values = {1, 2, 3, 4, 5};
    
    // 使用lambda作为参数
    forEach(values, [](int value) {
        std::cout << "Value: " << value << std::endl;
    });
    
    // 使用标准库中的高阶函数
    std::sort(values.begin(), values.end(), [](int a, int b) {
        return a > b; // 降序排序
    });
    
    return 0;
}

4. std::function(C++11及以上)

cpp 复制代码
#include <iostream>
#include <functional>

int add(int a, int b) { return a + b; }

// 高阶函数,使用std::function作为参数
int compute(int x, int y, std::function<int(int, int)> op) {
    return op(x, y);
}

int main() {
    // 使用函数指针
    std::cout << compute(5, 3, add) << std::endl;
    
    // 使用lambda
    std::cout << compute(5, 3, [](int a, int b) { return a * b; }) << std::endl;
    
    // 使用函数对象
    struct Power {
        int operator()(int a, int b) const { 
            int result = 1;
            for (int i = 0; i < b; ++i) result *= a;
            return result;
        }
    };
    std::cout << compute(2, 4, Power()) << std::endl; // 2^4 = 16
    
    return 0;
}

5. 返回函数的函数

cpp 复制代码
#include <iostream>
#include <functional>

// 返回一个函数(使用lambda)
std::function<int(int)> makeAdder(int x) {
    return [x](int y) { return x + y; };
}

int main() {
    auto add5 = makeAdder(5);
    std::cout << add5(3) << std::endl; // 输出 8
    std::cout << add5(10) << std::endl; // 输出 15
    
    return 0;
}

实际应用示例

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

// 高阶函数应用:过滤器
template <typename T>
std::vector<T> filter(const std::vector<T>& vec, std::function<bool(const T&)> predicate) {
    std::vector<T> result;
    for (const auto& item : vec) {
        if (predicate(item)) {
            result.push_back(item);
        }
    }
    return result;
}

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    // 过滤偶数
    auto evens = filter<int>(numbers, [](int x) { return x % 2 == 0; });
    
    // 过滤大于5的数
    auto greaterThan5 = filter<int>(numbers, [](int x) { return x > 5; });
    
    // 输出结果
    for (auto n : evens) std::cout << n << " ";
    std::cout << std::endl;
    
    for (auto n : greaterThan5) std::cout << n << " ";
    std::cout << std::endl;
    
    return 0;
}

高阶函数是函数式编程的重要概念,C++通过多种机制支持这一特性,使得代码更加灵活和可复用。

相关推荐
linweidong4 小时前
C++ 模块化编程(Modules)在大规模系统中的实践难点?
linux·前端·c++
冷雨夜中漫步8 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
半桔9 小时前
【IO多路转接】高并发服务器实战:Reactor 框架与 Epoll 机制的封装与设计逻辑
linux·运维·服务器·c++·io
HABuo9 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
我在人间贩卖青春10 小时前
C++之多重继承
c++·多重继承
颜酱10 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_7369191010 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi98783810 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
2501_9449347310 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
DuHz10 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理