回调函数详解:C++ 实例及 lambda 表达式
回调函数是指在某个事件发生或者异步操作完成时,由系统或程序自动调用的一个函数。回调函数通常作为参数传递给另一个函数,在操作完成后被调用。回调函数的作用是在异步操作完成后处理返回结果,或者在事件发生后执行相应的操作。回调函数常见于JavaScript、Node.js等语言和框架中。
C++ 回调函数示例
简单示例
#include <iostream>
#include <functional>
void foo(int x, int y, std::function<void(int)> callback) {
int sum = x + y;
callback(sum);
}
void bar(int result) {
std::cout << 'foo() returned ' << result << std::endl;
}
int main() {
foo(1, 2, bar);
return 0;
}
在这个例子中,foo()函数接受两个整数参数和一个回调函数参数callback。在foo()函数内部,它计算了x和y的和,并将该结果传递给回调函数callback。在调用foo()时,我们将一个名为bar的函数作为回调函数传递给它。这意味着当foo()计算出x和y的和时,它将调用bar()函数并将计算结果作为参数传递给它。在这种情况下,bar()函数打印了计算结果。
此示例使用了C++11中的std::function和lambda表达式来定义回调函数,但您也可以使用任何可调用对象,例如全局函数、类成员函数或函数对象,作为回调函数来传递给foo()函数。
复杂示例
下面是一个稍微复杂一些的C++回调函数示例:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
void printVector(const std::vector<int>& vec) {
std::cout << "Vector elements: ";
for (const auto& elem : vec) {
std::cout << elem << " ";
}
std::cout << std::endl;
}
void sortVector(std::vector<int>& vec, std::function<bool(int, int)> compareFunc) {
std::sort(vec.begin(), vec.end(), compareFunc);
}
int main() {
std::vector<int> vec = {4, 2, 1, 5, 3};
std::cout << "Before sorting: ";
printVector(vec);
std::function<bool(int, int)> compareFunc = [](int a, int b) { return a < b; };
sortVector(vec, compareFunc);
std::cout << "After sorting: ";
printVector(vec);
return 0;
}
在这个例子中,我们定义了两个函数printVector()和sortVector(),并且在main()函数中使用了回调函数来实现对sortVector()函数的排序方式进行自定义。sortVector()函数接受一个整数向量和一个回调函数参数compareFunc,该函数用于指定向量元素的排序方式。在main()函数中,我们定义了一个lambda表达式作为回调函数,该表达式将向量元素按升序排序。最后,我们调用sortVector()函数并打印排序后的向量元素。这个例子展示了回调函数的强大之处,它可以让我们在不改变函数本身的情况下,通过传递不同的回调函数来实现不同的功能。
lambda 表达式
lambda 表达式是一种匿名函数,可以在需要函数的地方定义并使用它,而不必显式地定义一个函数。lambda表达式通常用于函数对象、回调函数、算法等需要函数作为参数的场合。lambda表达式的语法类似于函数定义,由中括号、参数列表和函数体组成,可以使用捕获列表来捕获外部变量。例如,下面是一个简单的lambda表达式:
[](int x, int y) -> int { return x + y; }
这个lambda表达式接受两个整数参数x和y,并返回它们的和。箭头符号->用于指定返回类型,如果省略,则根据函数体自动推导。在使用lambda表达式时,我们可以将它作为函数对象传递给其他函数,例如:
std::vector<int> vec = {1, 2, 3, 4, 5};
std::transform(vec.begin(), vec.end(), vec.begin(), [](int x) { return x * x; });
这个例子使用了STL中的std::transform()算法,它接受一个输入范围、一个输出范围和一个一元函数对象,用于对输入范围中的每个元素进行转换。在这个例子中,我们使用lambda表达式作为函数对象,将输入范围中的每个元素平方,并将结果写入输出范围中。
transform 函数
transform 函数在 C++ 标准库的 <algorithm> 头文件中。
通过学习回调函数和 lambda 表达式,您可以更加灵活地使用 C++ 语言,并创建更加高效、可读性高的代码。
原文地址: https://www.cveoy.top/t/topic/jJbf 著作权归作者所有。请勿转载和采集!