2、以自定义struct或struct指针作为map的Key
若干问题:
struct Node {
int k, b;
friend bool operator <(Node a, Node b) {
return a.k < b.k;
}
}node1, node2;
map<Node, int> mp;
int main() {
node1.k = ;
node1.b = ;
mp[node1] = ;
node1.k = ;
node1.b = ;
printf("%d\n", mp.count(node1));
//输出1
return ;
}
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<Node, int> mp;
int main() {
node1.k = ;
node1.b = ;
mp[node1] = ;
node1.k = ;
node1.b = ;
printf("%d\n", mp.count(node1));
//输出0
return ;
}
1、以结构体为Key
map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),红黑树具有对数据自动排序(默认是以less<>升序对元素排序(排序准则也可以修改))的功能,因此在map内部所有的关键字都是有序的。当key为基本数据类型时,不存在问题。但是当关键字是一个结构体时,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候就会出错,下面给出解决这个问题的方法:
对操作符"<"进行重载(不可以重载大于号)
#include <map>
#include <iostream>
#include <string>
using namespace std;
struct Node{
int id;
string name;
friend bool operator < (Node a,Node b)
{
//指定排序策略,按id排序,如果id相等的话,按name排序
if (a.id != b.id) return a.id > b.id;
else return a.name > b.name;
}
}StudentInfo, *pStudentInfo; //学生信息 int main(){
int nSize;
//用学生信息映射分数
map<Node, int> mapStudent;
map<Node, int>::iterator it; StudentInfo.id = ;
StudentInfo.name = "student_one";
mapStudent.insert(pair<Node, int>(StudentInfo, ));
StudentInfo.id = ;
StudentInfo.name = "student_two";
mapStudent.insert(pair<Node, int>(StudentInfo, )); for (it = mapStudent.begin(); it != mapStudent.end(); it++)
cout << it->first.id << " " << it->first.name << " " << it->second << endl; }
printf("%d",mp.find(StudentInfo)->second);
printf("%d",mp[StudentInfo]); 都可以
重载的部分可以写到结构体外,但有三点要求:
1、把friend去掉,把小于号改成一对小括号。
2、用struct把函数包装起来。
3、map的定义方式改为map<Node, int, cmp> mapStudent;
如:
#include <map>
#include <iostream>
#include <string>
using namespace std;
struct Node{
int id;
string name; }StudentInfo, *pStudentInfo; //学生信息 struct cmp {
bool operator () (Node a, Node b)
{
//指定排序策略,按nID排序,如果nID相等的话,按strName排序
if (a.id != b.id) return a.id > b.id;
else return a.name > b.name;
}
};
map<Node, int, cmp> mapStudent;
map<Node, int, cmp>::iterator it;
int main(){
int nSize;
//用学生信息映射分数 StudentInfo.id = ;
StudentInfo.name = "student_one";
mapStudent.insert(pair<Node, int>(StudentInfo, ));
StudentInfo.id = ;
StudentInfo.name = "student_two";
mapStudent.insert(pair<Node, int>(StudentInfo, )); for (it = mapStudent.begin(); it != mapStudent.end(); it++)
cout << it->first.id << " " << it->first.name << " " << it->second << endl; }
printf("%d",mp.find(StudentInfo)->second);
printf("%d",mp[StudentInfo]); 也可以
2、以结构体指针为Key,可以不重载<号,因为地址可以比较大小。
但是也可以根据指针指向的内容重载小于号,但此时重载函数必须放在自定义的结构体外面。(原因不详。。。)
#include <map>
#include <iostream>
#include <cstdio>
using namespace std; struct Key
{
int x,y;
}*ptr; struct CompareKey
{
bool operator()(Key *in_a, Key *in_b)
{
return in_a->x < in_b->x;
}
}; map<Key *, int, CompareKey> mp; int main()
{ for (int i = ; i < ; i++)
{
Key *k = new Key;
if(i==) ptr=k; k->x = i;
k->y = i+; mp.insert(make_pair(k, i));
} map<Key *, int, CompareKey>::iterator it;
for(it=mp.begin();it!=mp.end();it++){
if(it->first==ptr){
printf("%d %d %d\n",it->first->x,it->first->y,it->second);
}
} }
2、以自定义struct或struct指针作为map的Key的更多相关文章
- 指针做MAP的KEY的TEST
用struct做map的key会需要"operator <"等等,还会出现奇怪的问题可能. 试了下用指针做key,看看效果: #include <iostream> ...
- typedef struct与struct的区别
typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据 ...
- 结构体struct sockaddr_in, struct sockaddr,struct in_addr
一.结构体 struct sockaddr_in, struct sockaddr, struct in_addr struct sockaddr_in, struct sockaddr,str ...
- typedef struct与struct定义结构体
今天在定义结构体的时候发现typedef struct与struct定义结构体有一些不同之处: 结构也是一种数据类型, 能够使用结构变量, 因此, 象其他 类型的变量一样, 在使用结构变量时要先对其 ...
- linux网络接口,struct ifreq struct ifconf结构
网络相关的ioctl请求的request参数及arg地址必须指向的数据类型如下表所示: 接口 SIOCGIFCONF SIOCSIFADDR SIOCGIFADDR SIOCSIFBRDADDR SI ...
- map的key 为指针
STL中map的key能否用char *呢?当然可以! 在程序中需要用到一个map,本来是这样写的,map<string, int> mapStr; 为了追求效率,把string改成了ch ...
- 关于set或map的key使用自定义类型的问题
我们都知道set或map的key使用自定义类型时必须重载<关系运算符 但是,还有一个条件,所调用重载的小于操作符,使用的对象必须是const 而对象调用的方法也必须是const的 1 #incl ...
- [C++学习笔记14]动态创建对象(定义静态方法实现在map查找具体类名对应的创建函数,并返回函数指针,map真是一个万能类)good
[C++学习笔记14]动态创建对象 C#/Java中的反射机制 动态获取类型信息(方法与属性) 动态创建对象 动态调用对象的方法 动态操作对象的属性 前提:需要给每个类添加元数据 动态创建对象 实 ...
- Flink 自定义source和sink,获取kafka的key,输出指定key
--------20190905更新------- 沙雕了,可以用 JSONKeyValueDeserializationSchema,接收ObjectNode的数据,如果有key,会放在Objec ...
随机推荐
- Is this Sentence Difficult? Do you Agree? -paper
术语: 数据lemma:词根,词元(词的基本形式,如名词单数或动词的不定式形式) content words:实词part-of-speech:词性object-relative clauses an ...
- Beta周第14次Scrum会议(11/23)【王者荣耀交流协会】
一.小组信息 队名:王者荣耀交流协会 小组成员 队长:高远博 成员:王超,袁玥,任思佳,王磊,王玉玲,冉华 小组照片 二.开会信息 时间:2017/11/23 17:02~17:14,总计12min. ...
- Python简单介绍
一.变量名命名规则 1).变量名要由字母数字下划线组成 2)变量名禁止以数字开头 3)变量名禁止使用Python自带关键字 4)变量名不要用中文和拼音 5)变量名大小写敏感 6)变量名推荐写法:下划线 ...
- ubuntu安装mysql遇到的问题
ERROR 1698 (28000): Access denied for user 'root'@'localhost' ubantu linux下安装新版mysql,登录时必须sudo mysql ...
- c# 敏捷3 连接,批量处理,分页
class Program { public class post { public int id { get; set; } public string name { get; set; } pub ...
- MySQL安装配置错误\日常使用错误
1.出现报错---应用程序无法正常启动0xc000007b 安装direct 9.0 安装vc++ 2005 安装vc++ 2008 安装vc++ 2012(x64和x86都要装) 安装 .NET4. ...
- 【HDOJ3567】【预处理bfs+映射+康拓展开hash】
http://acm.hdu.edu.cn/showproblem.php?pid=3567 Eight II Time Limit: 4000/2000 MS (Java/Others) Me ...
- Python 3.5 in win10 pip install Orange3
http://www.lfd.uci.edu/%7Egohlke/pythonlibs/ 下载Orange3 以及 依赖包 注意网页上标出的Orange 的依赖,以及 https://github.c ...
- mysql 服务器启用event_scheduler
https://blog.csdn.net/yangzefei1991/article/details/51800867 首先在sql中查询计划事件的状态:SHOW VARIABLES LIKE 'e ...
- Go Example--工作池
package main import ( "fmt" "time" ) func main() { jobs :=make(chan int,100) res ...