关于重载的问题如何理解


struct Student {
    unsigned ID;
    string Name;
    int Score;
    bool operator<(const Student& s) const {
        return ID < s.ID;
    }
};
struct StudentHash {
    size_t operator()(const Student& s) const {
        return hash<unsigned>()(s.ID);
    }
};
struct StudentEqual {
    bool operator()(const Student& s1, const Student& s2) const {
        return s1.ID == s2.ID;
    }
};

问下这个里重载的两个()分别是什么意思,干什么用的
完整代码如下:


#include <iostream>
#include <set>
#include <unordered_set>
#include <string>
using namespace std;
struct Student {
    unsigned ID;
    string Name;
    int Score;
    bool operator<(const Student& s) const {
        return ID < s.ID;
    }
};
struct StudentHash {
    size_t operator()(const Student& s) const {
        return hash<unsigned>()(s.ID);
    }
};
struct StudentEqual {
    bool operator()(const Student& s1, const Student& s2) const {
        return s1.ID == s2.ID;
    }
};
int main() {
    Student stu[] = { {1004, "AAAA",90}, {1002, "BBBB",80}, {1005, "CCCC",85}, {1007, "DDDD",75}, {1001, "EEEE",65}
    };
    int n = sizeof(stu) / sizeof(stu[0]);    // 使用set
    set<Student> s1(stu, stu + n);
    for (auto s : s1) {
        cout << s.ID << " " << s.Name << " " << s.Score << endl;
    }    // 使用multiset
    multiset<Student> s2(stu, stu + n);
    for (auto s : s2) {
        cout << s.ID << " " << s.Name << " " << s.Score << endl;
    }    // 使用unordered_set
    unordered_set<Student, StudentHash, StudentEqual> s3(stu, stu + n);
    for (auto s : s3) {
        cout << s.ID << " " << s.Name << " " << s.Score << endl;
    }system("pause");
    return 0;
}

一个把Student类型的对象映射为哈希值,另一个StudentEqual结构体中重载就是为了比较两个Student类型的对象是否相等

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7695482
  • 你也可以参考下这篇文章:只交换相邻元素的条件下,排序数组需要的最小交换次数
  • 除此之外, 这篇博客: 如何理解指针与数组之间的关系中的 下面我们再来分析两个有意思的代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • (*(void(*)()0)()

    我们从内往外一步一步来分析:

    1、(void(*)()0 将0强制转换为数组指针
    假设 a=(void(*)()0
    2 、 *a 将a解引用
    3、整体是个函数

    void (*signal(int,void(*)(int)))(int);

    1、signal是一次函数声明
    2、signal函数的参数:第一个是int(整形),第二个是函数指针,该函数指针指向的函数参数为int,返回类型是void

    5、函数指针数组
    函数指针数组:数组是存放相同类型数据的存储空间,当我们把函数的地址存到一个数组中,这个数组就叫做函数指针数组。
    通过指针数组 :int *arr[10]
    得到函数指针数组:int (*arr[10])()

  • 您还可以看一下 张飞老师的硬件开发与电路设计速成入门到精通视频教程第一部课程中的 分析整流桥电路,电容计算小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    对于重载的概念,可以简单地理解为在一个作用域内,有多个同名函数或运算符,但是它们的参数列表不同,这种情况下就发生了函数或运算符的重载。对于两个括号进行重载,实际上是函数调用运算符(())的重载。在代码中,可以通过在一个类中声明函数调用运算符的重载来实现该操作。例如:

    class MyClass {
    public:
        int operator () (int a, int b) {
            return a + b;
        }
        string operator () (string s1, string s2) {
            return s1 + s2;
        }
    };
    MyClass myClass;
    int result1 = myClass(1, 2); // 调用 operator () (int a, int b)
    string result2 = myClass("hello", "world"); // 调用 operator () (string s1, string s2)
    

    这里的 Myclass 就是一个简单的示例类,它重载了函数调用运算符,用于传入参数并返回结果。重载可以根据不同的参数类型返回不同类型的结果,这就是 C++ 函数模板和运算符重载技术所支持的功能之一。可以通过重载小大于运算符,实现对自定义类型的排序。

    至于各段参考资料中的内容,第一段无关重载,第二、三段讲解了指针作为函数参数时的传参方式,第四段讲解了快速排序算法,第五段讲解了嵌入式开发的一些基础概念和学习路线。