最近完成项目遇到一个问题 map需要设计多个键值,也就是key-value的key希望是一个结构体,里面有好几个元素:
网上查阅了资料(主要参考:https://blog.csdn.net/u010636181/article/details/100533726),解决方案如下:
主要就是需要设置一下 < 比较符的定义,因为只有一个键值的时候是很好比较的,但使用结构体后,我们就需要考虑比较关系
我们使用bool operator<()函数来重载<运算符,具体的写法有两种,在样例代码中有所展示(这里我写的是优先比较年龄,之后再比较名字)。
样例代码:
//
// main.cpp
// table_test
//
// Created by Qiucheng LIN on 2020/2/5.
// Copyright © 2020 Qiucheng LIN. All rights reserved.
//
#include <iostream>
#include <map>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
struct Man{
std::string name;
int age;
bool operator<(const Man& g)const {
// return (age<g.age)||(age==g.age&&name<g.name); //这是第一种写法
if(age<g.age){
return true;
}
else if(age>g.age)
return false;
else{
if(name<g.name)
return true;
else
return false;
}
}
};
struct Tripple
{
int score [ 3 ];
};
int main() {
std::map<Man, Tripple > Infos ;
Tripple triple_score1 = {70,80,90},triple_score2 = {0,0,0},triple_score3 = {10,20,30};
Man man1,man2,man3,man4;
man1.name = "Lacy";
man1.age = 21;
man2.name = "Lucy";
man2.age = 24;
man3.name = "James";
man3.age = 21;
//插入操作
Infos.insert(std::map<Man, Tripple>::value_type (man1, triple_score1));
Infos.insert(std::map<Man, Tripple>::value_type (man2, triple_score2));
Infos.insert(std::map<Man, Tripple>::value_type (man3, triple_score3));
//遍历
for(std::map<Man, Tripple>::iterator iter = Infos.begin(); iter != Infos.end(); ++iter) {
std::cout << iter->second.score[0]<< std::endl;
std::cout << iter->second.score[1]<< std::endl;
std::cout << iter->second.score[2]<< std::endl;
}
man4.name = "Lucy";
man4.age = 24;
//查找
std::map<Man, Tripple>::iterator iter2=Infos.find(man2);
if(iter2==Infos.end()) {
printf("can't find\n");
return 0;
}
std::cout << iter2->second.score[0]<< std::endl;
std::cout << iter2->second.score[1]<< std::endl;
std::cout << iter2->second.score[2]<< std::endl;
return 0;
}