若干问题:
struct Node { int k, b; friend bool operator <(Node a, Node b) { return a.k < b.k; }}node1, node2;map mp;int main() { node1.k = 1; node1.b = 1; mp[node1] = 1; node1.k = 1; node1.b = 2; printf("%d\n", mp.count(node1)); //输出1 return 0;}
View Code
struct Node { int k, b; friend bool operator <(Node a, Node b) { if (a.k != b.k) return a.k < b.k; else return a.b < b.b; }}node1, node2;map mp;int main() { node1.k = 1; node1.b = 1; mp[node1] = 1; node1.k = 1; node1.b = 2; printf("%d\n", mp.count(node1)); //输出0 return 0;}
View Code
1、以结构体为Key
map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),红黑树具有对数据自动排序(默认是以less<>升序对元素排序(排序准则也可以修改))的功能,因此在map内部所有的关键字都是有序的。当key为基本数据类型时,不存在问题。但是当关键字是一个结构体时,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候就会出错,下面给出解决这个问题的方法:
对操作符"<"进行重载(不可以重载大于号)
#include
printf("%d",mp.find(StudentInfo)->second);printf("%d",mp[StudentInfo]); 都可以
重载的部分可以写到结构体外,但有三点要求:
1、把friend去掉,把小于号改成一对小括号。
2、用struct把函数包装起来。
3、map的定义方式改为map<Node, int, cmp> mapStudent;
如:
#include
printf("%d",mp.find(StudentInfo)->second);printf("%d",mp[StudentInfo]); 也可以
2、以结构体指针为Key,可以不重载<号,因为地址可以比较大小。
但是也可以根据指针指向的内容重载小于号,但此时重载函数必须放在自定义的结构体外面。(原因不详。。。)
#include