C++函数对象Functor与匿名函数对象Lambda表达式详解
什么是函数对象?
C++中的函数对象指的是重载了“()”运算符的类,可以像函数一样被调用,也被称为仿函数。与普通的函数不同的是,函数对象可以保存状态信息或者自定义行为,更加灵活。
在实现上,函数对象重载的“()”运算符应该是一个const成员函数,参数及返回值根据需要而定。函数对象的实现可以参考下面的代码:
class MyFunctor{
public:
int operator() (int a, int b) const{
return a + b;
}
};
函数对象与算法的结合
函数对象通常和STL中的算法一起使用,可以非常方便的实现各种需求。如下面的代码所示,使用std::sort函数对vector容器进行排序,需要传入一个排序的规则比较函数对象。
#include <algorithm>
#include <vector>
#include <iostream>
class MyLess{
public:
bool operator() (const int& lhs, const int& rhs) const{
return lhs < rhs;
}
};
int main()
{
std::vector<int> nums = {3, 1, 4, 2, 5};
std::sort(nums.begin(), nums.end(), MyLess());
for(int num : nums){
std::cout << num << " ";
}
}
输出结果为:1 2 3 4 5
Lambda表达式
Lambda表达式是C++11引入的新特性。它是一种匿名函数对象,可以在需要使用函数对象的地方定义,非常方便。Lambda表达式的格式如下:
[capture list] (param list) -> ret type {body};
其中,capture list是捕获列表,用来捕获一些变量,可以为空;param list是形参列表,可以为空;ret type是返回值类型,可以为空;body是函数体。
下面是一个简单的例子,演示Lambda表达式的使用:
#include <iostream>
int main()
{
auto func = [](){ std::cout << "Hello World" << std::endl; };
func();
}
输出结果为:Hello World
在上面的代码中,使用auto关键字定义了一个Lambda表达式,并将其赋值给func变量,然后通过调用func()函数来执行Lambda表达式中定义的内容。
Lambda表达式与算法的结合
与函数对象一样,Lambda表达式可以和STL中的算法一起使用。下面是一个实现将vector中的元素按照奇偶性进行分组的例子:
#include <algorithm>
#include <vector>
#include <iostream>
int main()
{
std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9};
std::vector<int> odds;
std::vector<int> evens;
std::for_each(nums.begin(), nums.end(), [&](int num){
if(num % 2 == 1){
odds.push_back(num);
}
else{
evens.push_back(num);
}
});
std::cout << "Odd numbers:";
for(int num : odds){
std::cout << " " << num;
}
std::cout << std::endl << "Even numbers:";
for(int num : evens){
std::cout << " " << num;
}
}
输出结果为:Odd numbers: 1 3 5 7 9
Even numbers: 2 4 6 8
在上面的代码中,使用std::for_each函数对vector容器中的元素逐一处理,并通过Lambda表达式将奇数和偶数分别插入到不同的容器中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++函数对象Functor与匿名函数对象Lambda表达式详解 - Python技术站