您的位置:首页 > 新闻 > 资讯 > 在线图片编辑免费版_国家企业信用信息公示系统网官方_百度指数查询官方网_外包公司是正规公司吗

在线图片编辑免费版_国家企业信用信息公示系统网官方_百度指数查询官方网_外包公司是正规公司吗

2024/12/24 20:06:17 来源:https://blog.csdn.net/2301_80434764/article/details/144156391  浏览:    关键词:在线图片编辑免费版_国家企业信用信息公示系统网官方_百度指数查询官方网_外包公司是正规公司吗
在线图片编辑免费版_国家企业信用信息公示系统网官方_百度指数查询官方网_外包公司是正规公司吗

仿函数(Functor)是指那些重载了函数调用运算符operator()的对象或类。换句话说,仿函数是实现了operatro()操作符的类或结构体。通过这个操作符,可以将对象作为函数来使用,故命名为仿函数。

1.基础概念

仿函数的定义:

// 定义一个仿函数类
class Adder {
public:// 构造函数,初始化加数Adder(int value) : value(value) {}// 重载 operator(),使得对象可以像函数一样被调用int operator()(int x) const {return value + x;}private:int value;
};int main() {Adder add5(5);  // 创建一个加5的仿函数对象std::cout << add5(3) << std::endl;  // 调用仿函数,结果是8return 0;
}

 2.仿函数与普通函数的区别

普通函数:函数在定义的时候就确定了,不能像对象一样传递或修改

仿函数:是一个对象,可以作为参数传递,可以拥有状态(成员变量),可以重载operator()来定义其行为

3.仿函数的应用

3.1与标准库算法一起使用

C++ 的标准库算法(如 std::for_each, std::sort, std::transform)通常使用仿函数作为参数。仿函数能够根据算法的需要定义自定义的操作。

#include <iostream>
#include <vector>
#include <algorithm>class Print {
public:void operator()(int x) const {std::cout << x << " ";}
};int main() {std::vector<int> v = {1, 2, 3, 4, 5};// 使用仿函数 Print// 下面的Print()实际上就是创建了一个Print类型并传递给std::for_eachstd::for_each(v.begin(), v.end(), Print());return 0;
}

3.2自定义排序与比较 

仿函数经常用于自定义排序算法。通过传递一个仿函数对象,用户可以定义排序的规则,话句话说,排序的逻辑取决于你怎么实现。

#include <iostream>
#include <vector>
#include <algorithm>class Compare {
public:bool operator()(int a, int b) const {return a > b;  // 降序排序}
};int main() {std::vector<int> v = {10, 30, 20, 50, 40};// 使用自定义的 Compare 仿函数排序std::sort(v.begin(), v.end(), Compare());for (int num : v) {std::cout << num << " ";}return 0;
}

4.总结

仿函数可以携带状态(因为它有自己的成员变量),可以支持多个参数,可以定义更加复杂的逻辑,当然,还有一点,在使用STL算法的时候,使用仿函数可以避免不必要的内存分配或函数指针传递(仿函数本质是类,类的成员函数默认是内联,是直接展开的),所以其通常比函数指针更高效 。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com