学习C++仿函数时,比如利用仿函数从大到小排序规则,在使用时加括号和不加括号的原因什么?如
#include <map>
#include<iostream>
#include<vector>
using namespace std;
#include<string>
#include <algorithm>
class MyCompare {
public:
bool operator()(int v1, int v2) const {
return v1 > v2;
}
};
void test201()
{
//默认从小到大排序
//利用仿函数实现从大到小排序
map<int, int, MyCompare> m;
m.insert(make_pair(1, 20));
m.insert(make_pair(2, 20));
m.insert(make_pair(3, 30));
m.insert(make_pair(4, 50));
m.insert(make_pair(5, 10));
for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {
cout << "key:" << it->first << " value:" << it->second << endl;
}
}
class GreaterFive {
public:
bool operator()(int val) {
return val > 5;
}
};
//找到大于5的数
void test_011() {
vector<int> v2;
for (int i = 0; i < 10; i++)
{
v2.push_back(i);
}
vector<int>::iterator it1 = find_if(v2.begin(), v2.end(), GreaterFive());
if (it1 == v2.end()) {
cout << "没找到!" << endl;
}
else {
cout << "找到:" << *it1 << endl;
}
}
这里find_if(v2.begin(), v2.end(), GreaterFive());的GreaterFive()和map<int, int, MyCompare>的MyCompare;
再比如用for_each遍历,采用普通函数为什么只需传函数名?
#include <algorithm>
#include <vector>
#include<iostream>
using namespace std;
//普通函数
void print01(int val)
{
cout << val << " ";
}
//函数对象
class print02
{
public:
void operator()(int val)
{
cout << val << " ";
}
};
void test_01() {
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
//遍历算法
for_each(v.begin(), v.end(), print01);
cout << endl;
for_each(v.begin(), v.end(), print02());
cout << endl;
}
int main() {
test_01();
system("pause");
return 0;
}
希望大家解惑,谢谢
你这里的MyCompare是个类, 如果类不加括号, 可用于声明, 如
map<int, int, MyCompare> m; 这里int 和MyCompare都是类,
而类加括号, 意味着构造一个对象, 这个对象相当于一个函数也就是仿函数, 函数指针和lambda可以作为平替.
print01(5) 等同 print02()(5)
仿函数?你说的是函数指针吧
带括号表示调用
不带括号表示函数指针本身
vector<int>::iterator it1 = find_if(v2.begin(), v2.end(), GreaterFive()); //GreaterFive()代表一个临时的对象,find_if会对这个对象调用 operator() ,也就是所谓的仿函数,普通的函数会直接调用