目录
1.什么是函数对象
函数对象是C++中的一种编程概念,也称为函数符或仿函数。其实就是重载"()"操作符,使得类对象可以像函数那样调用。
**分类:**假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们就将这个类称为"一元仿函数";相反,如果重载的operator()要求获取两个参数,就将这个类称为"二元仿函数"。
**函数对象的作用主要是什么?**STL提供的算法往往都有两个版本,其中一个版本表现出最常用的某种运算,另⼀版本则允许用户通过template参数的形式来指定所要采取的策略。
2.仿函数示例
cpp
#include <iostream>
using namespace std;
//定义自己的仿函数
class MyPrint {
public:
int _num;
MyPrint() {
_num = 0;
}
void operator()(int n) {
cout << n << endl;
_num++;
}
};
int main() {
MyPrint my;
my(10);
my(20);
my(30);
cout << my._num << endl;
return 0;
}
这是一个使用仿函数的简单示例。在这个例子中,
MyPrint
是一个仿函数类,它定义了operator()
,使得类的实例可以像函数一样被调用。在main
函数中,首先创建了MyPrint
类的一个实例my
,然后通过调用my(10)
、my(20)
、my(30)
来使用仿函数,最后输出_num
的值。简要解释每个部分:
MyPrint
类定义了一个整数成员变量_num
,并在构造函数中初始化为0。operator()
是该类的重载函数,使得类的实例可以被调用。在这个例子中,调用仿函数时会输出传入的整数,并递增_num
的值。- 在
main
函数中,首先创建了MyPrint
的实例my
。然后通过my(10)
、my(20)
、my(30)
分别调用了仿函数。最后输出了_num
的值,即仿函数被调用的次数。
3.代码示例
cpp
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
class MyComparator {
public:
bool operator()(int a, int b) {
return a > b;
}
};
int main() {
vector<int> numbers = { 3, 1, 4, 1, 5, 9, 2, 6 };
sort(numbers.begin(), numbers.end(), MyComparator());
for (int num : numbers) {
cout << num << " ";
}
return 0;
}
这段代码演示了如何使用自定义的比较函数对象(仿函数)来对 C++ 标准库中的
std::sort
进行自定义排序。具体解释:
MyComparator 类定义:
MyComparator
是一个类,其中定义了一个重载的圆括号操作符operator()
。这使得MyComparator
类的实例可以像函数一样被调用。std::vector 初始化:
- 通过
std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6};
初始化了一个包含整数的向量。std::sort 调用:
std::sort
函数用于对容器进行排序。在这里,std::sort(numbers.begin(), numbers.end(), MyComparator());
使用了自定义的比较函数MyComparator
进行排序。这表示按照MyComparator
的定义,即按照数字的逆序进行排序。排序后输出:
- 最后通过循环遍历输出排序后的结果。
for (int num : numbers)
:这是范围for循环的语法,它用于遍历容器中的每个元素。这里,numbers
是一个容器(std::vector<int> 类型),而int num
则是循环过程中每个元素的临时变量。这段代码最终会输出:9 6 5 4 3 2 1 1
写在最后:以上就是本篇文章的内容了,感谢你的阅读。如果感到有所收获的话可以给博主点一个赞哦。如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~