仿函数 函数对象 lambda

仿函数相关的内容

概念

  • 仿函数 通过重载operator()操作符实现的类似于函数的对象

  • 仿函数的主要优点在于它们能够像普通函数一样被调用,但同时还可以拥有状态和成员变量。

  • 比起函数指针。在需要携带状态或配置参数的场景中更加适用。

实验代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <vector>
#include <algorithm>

// 定义一个仿函数类,作为排序比较器
class Compare {
public:
bool operator()(int a, int b) const {
return a > b; // 降序排序
}
};

int main() {
std::vector<int> vec = {1, 4, 2, 8, 5, 7};

// 使用仿函数进行排序
std::sort(vec.begin(), vec.end(), Compare());

// 输出排序后的结果
for (int v : vec) {
std::cout << v << " ";
}

return 0;
}

lambda表达式

  • lambda是一个匿名函数对象.
1
2
3
[capture](parameters) -> return_type {
// function body
}
  • 它的组成如下:

    • capture:捕捉列表,捕获所属作用域中的变量,并且如果不是引用,。

      • 当捕获列表为[&],可以捕获当前域内的所有变量的引用。
    • parameters:参数列表,与普通函数类似,不过这里可以省略。

    • return_type:返回类型,可以省略,编译器会自动推导

    • function body:函数体,包含lambda表达式的具体操作。

  • 在实例化的时候,需要使用auto推导。

实验代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
std::vector<int> vec = {1, 4, 2, 8, 5, 7};

// 使用lambda表达式进行降序排序
std::sort(vec.begin(), vec.end(), [](int a, int b) {
return a > b;
});

// 输出排序后的结果
for (int v : vec) {
std::cout << v << " ";
}

return 0;
}


仿函数 函数对象 lambda
https://weihehe.top/2024/08/01/仿函数/
作者
weihehe
发布于
2024年8月1日
许可协议