c++ map需要使用多个键值如何编写

最近完成项目遇到一个问题 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;
}

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值