下面是关于如何应用C++的函数对象的完整攻略。
什么是函数对象
在C++中,函数对象(Functors)是一种可调用的对象,它可以像函数一样使用。通常,函数对象通过重载operator()
来实现这种可调用的行为。
函数对象广泛用于STL中,因为容器类通常需要用到函数对象来实现一些算法,比如sort()、find_if()等等。
如何定义函数对象
函数对象可以像定义普通函数一样定义,只不过需要重载operator()
。
class MyFunctor{
public:
int operator()(int a, int b){
return a+b;
}
};
上面的代码定义了一个名为MyFunctor
的函数对象,它重载了operator()
,实现了两个参数相加的操作。使用时,可以实例化MyFunctor
对象,并调用它的operator()
函数。
MyFunctor myFunc;
int result = myFunc(1, 2); // 3
函数对象可以带参数
除了构造函数外,函数对象还可以定义其他的成员函数,并使用构造函数传递参数,从而实现更加复杂的操作。
class MyFunctor{
public:
MyFunctor(int weight):
m_weight(weight){}
int operator()(int a, int b){
return m_weight * (a+b);
}
private:
int m_weight;
};
上述代码定义的MyFunctor
函数对象带有一个参数m_weight
,并将其通过构造函数进行赋值。它的operator()
实现了两个参数相加并乘以权重的操作。
MyFunctor myFunc(10);
int result = myFunc(1, 2); // 30
使用函数对象排序
下面来看一个使用函数对象在容器中排序的例子。在这个例子中,我们将使用一个名为Person
的结构体表示人,然后使用一个名为AgeCompare
的函数对象来定义从小到大的排序规则。
#include <iostream>
#include <vector>
#include <algorithm>
struct Person{
int age;
std::string name;
};
class AgeCompare{
public:
bool operator()(const Person& p1, const Person& p2){
return p1.age < p2.age;
}
};
int main(){
std::vector<Person> persons{
{23, "Tom"},
{26, "Jack"},
{18, "Alice"}
};
std::sort(persons.begin(), persons.end(), AgeCompare());
for(auto p : persons){
std::cout << p.name << ": " << p.age << std::endl;
}
return 0;
}
上面的代码中,我们定义了一个名为AgeCompare
的函数对象,重载了operator()
以实现从小到大的排序。在main函数中,创建了一个vector<Person>
容器,然后通过sort
函数进行排序,最后输出排序结果。
使用函数对象查找
除了排序外,函数对象还可以用于查找,下面是一个使用函数对象查找的例子。在这个例子中,我们将使用一个名为Even
的函数对象来查找容器中是否含有偶数。
#include <iostream>
#include <vector>
#include <algorithm>
class Even{
public:
bool operator()(int num){
return num % 2 == 0;
}
};
int main(){
std::vector<int> nums{1, 3, 4, 5, 8};
auto it = std::find_if(nums.begin(), nums.end(), Even());
if(it != nums.end()){
std::cout << "Found even number: " << *it << std::endl;
}else{
std::cout << "No even number found" << std::endl;
}
return 0;
}
上述代码创建了一个名为Even
的函数对象,用来判断一个数是否为偶数。在main函数中,创建了一个vector<int>
容器,然后使用std::find_if
函数和Even
函数对象查找是否有偶数存在,最后输出查找结果。
总结
函数对象是C++中非常重要的一种程序元素,它能够替代函数,实现更加复杂的操作。本文对函数对象进行了详细的介绍,并给出了两个使用函数对象的示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何应用C++的函数对象 - Python技术站