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类型的对象是否相等
(*(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])()
答案:
对于重载的概念,可以简单地理解为在一个作用域内,有多个同名函数或运算符,但是它们的参数列表不同,这种情况下就发生了函数或运算符的重载。对于两个括号进行重载,实际上是函数调用运算符(())的重载。在代码中,可以通过在一个类中声明函数调用运算符的重载来实现该操作。例如:
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++ 函数模板和运算符重载技术所支持的功能之一。可以通过重载小大于运算符,实现对自定义类型的排序。
至于各段参考资料中的内容,第一段无关重载,第二、三段讲解了指针作为函数参数时的传参方式,第四段讲解了快速排序算法,第五段讲解了嵌入式开发的一些基础概念和学习路线。