C++学习第二十三课:函数对象与Lambda表达式

在这里插入图片描述

C++学习第二十三课:函数对象与Lambda表达式

在C++中,函数对象是一种可以像函数一样使用的类类型对象。它们通常用于定义操作,这些操作可以作为参数传递给算法,或者用于自定义行为。Lambda表达式是C++11引入的一种便捷的匿名函数对象的语法。本课将详细介绍函数对象的概念、Lambda表达式的使用,以及如何将它们应用于STL算法中。

1. 函数对象概述

函数对象是重载了函数调用运算符operator()的类的实例。

示例代码
#include <iostream>
#include <algorithm>

class Square {
public:
    int operator()(int x) const {
        return x * x;
    }
};

int main() {
    Square square;
    std::cout << "Square of 3 is: " << square(3) << std::endl;
}

2. 使用标准库函数对象

STL提供了一些标准的函数对象,如std::plusstd::minusstd::multiplies等。

示例代码
#include <numeric>

int main() {
    int result = std::accumulate({1, 2, 3, 4, 5}, 0, std::plus<int>());
    std::cout << "Sum is: " << result << std::endl;
}

3. Lambda表达式基础

Lambda表达式提供了一种创建匿名函数对象的方法。

示例代码
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::sort(vec.begin(), vec.end(), [](int a, int b) {
        return a > b; // 降序排序
    });
}

4. Lambda的捕获机制

Lambda表达式可以捕获其外部作用域中的变量。

示例代码
int main() {
    int n = 10;
    auto lambda = [n] { return n * 2; };
    std::cout << lambda() << std::endl; // 输出20
}

5. Lambda的参数和返回类型

Lambda表达式可以有参数,并且可以自动推断返回类型。

示例代码
auto add = [](int a, int b) { return a + b; };
std::cout << add(5, 10) << std::endl; // 输出15

6. Lambda与STL算法

Lambda表达式经常与STL算法一起使用,以提供自定义行为。

示例代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    auto it = std::find_if(vec.begin(), vec.end(), [](int v) {
        return v > 3;
    });
    if (it != vec.end()) {
        std::cout << "Found: " << *it << std::endl;
    }
}

7. Lambda的mutable和const限定

Lambda表达式可以是mutable的,允许修改捕获的变量。

示例代码
auto increment = [](int& v) mutable {
    v += 10; // 修改传入的变量
};
int x = 5;
increment(x);
std::cout << x << std::endl; // 输出15

8. Lambda的泛型编程

Lambda可以与模板代码一起使用,实现泛型编程。

示例代码
auto myFunction = [](auto a, auto b) {
    return a + b;
};
std::cout << myFunction(5, 10) << std::endl; // 输出15
std::cout << myFunction(3.14, 2.71) << std::endl; // 输出5.85

结语

通过本课的学习,你深入了解了C++中的函数对象和Lambda表达式,包括它们的语法、用法、与STL算法的结合使用、捕获机制、泛型编程、性能考量以及在现代C++中的应用。

函数对象和Lambda表达式是C++中实现泛型编程和自定义行为的强大工具,它们使得代码更加简洁和灵活。掌握这些特性对于编写高效、可读性强的C++程序至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值