weixin_67207019 2023-07-27 12:27 采纳率: 0%
浏览 18

C++仿函数使用带不带括号的原因

学习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;
}

希望大家解惑,谢谢

  • 写回答

3条回答 默认 最新

  • 关注

    你这里的MyCompare是个类, 如果类不加括号, 可用于声明, 如
    map<int, int, MyCompare> m; 这里int 和MyCompare都是类,
    而类加括号, 意味着构造一个对象, 这个对象相当于一个函数也就是仿函数, 函数指针和lambda可以作为平替.
    print01(5) 等同 print02()(5)

    评论

报告相同问题?

问题事件

  • 创建了问题 7月27日

悬赏问题

  • ¥15 征集Python提取PDF文字属性的代码
  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?