东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2259|回复: 0
打印 上一主题 下一主题

[C/C++] 两个结构体,用有序map进行关联,同时根据value结构体的某key...

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14437
QQ
跳转到指定楼层
楼主
发表于 2021-12-7 13:50:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式





两个结构体,用有序map进行关联,同时根据value结构体的某key排序



  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<vector>
  4. #include<algorithm>
  5. #include<map>
  6. using namespace std;


  7. // 两个结构体,用有序map进行关联,同时根据value结构体的某key排序

  8. typedef struct my_map_key
  9. {
  10.         int v1;
  11.         int v2;

  12.         // 基于v2的大小进行比较 需要排序啊 这是有序map啊
  13.         bool operator<(my_map_key const& other) const
  14.         {
  15.                 return this->v2 <= other.v2;          // 从小到大排序比较
  16.         }
  17. } my_map_key;

  18. typedef struct my_map_value
  19. {
  20.         float loss;
  21.         int num;

  22. } my_map_value;




  23. // // 自定义map打印函数:使用for_each遍历打印
  24. // inline void Display(map<my_map_key, int>::value_type & v)
  25. // {
  26. //         cout << v.second << endl;
  27. // }

  28. // 按照value进行比较
  29. typedef pair<my_map_key, my_map_value> PAIR;

  30. bool cmp_by_value(const PAIR& v1, const PAIR & v2)
  31. {
  32.         return v1.second.loss < v2.second.loss;
  33. }

  34. // 按照value进行比较
  35. // struct cmpByValue
  36. // {
  37. //         bool operator()(const PAIR& v1, const PAIR& v2)
  38. //         {
  39. //                 return v1.second < v2.second;
  40. //         }
  41. // };

  42. int main()
  43. {
  44.         // 提示:对于有序map来说,如果key没有重载<操作符,是无法插入成功的。因此,对于自定义类型的key,必须实现<操作符重载
  45.         map<my_map_key, my_map_value> m;
  46.    
  47.        
  48.         // 对map中进行元素的插入
  49.         my_map_key t;
  50.     my_map_value value;

  51.         t.v1 = 10;
  52.         t.v2 = 3;
  53.     value.loss = 10;
  54.     value.num = 100;
  55.         m.insert(pair<my_map_key, my_map_value>(t,value));
  56.        
  57.         t.v2 = -3;
  58.     value.loss = 2;
  59.         m.insert(pair<my_map_key, my_map_value>(t, value));

  60.         t.v2 = -2;
  61.     value.loss = 20;
  62.         m.insert(pair<my_map_key, my_map_value>(t, value));

  63.         t.v2 = 9;
  64.     value.loss = 8;
  65.         m.insert(pair<my_map_key, my_map_value>(t, value));

  66.         t.v2 = 32;
  67.     value.loss = 0;
  68.         m.insert(pair<my_map_key, my_map_value>(t, value));

  69.         t.v2 = 13;
  70.     value.loss = 90;
  71.         m.insert(pair<my_map_key, my_map_value>(t, value));

  72.         t.v2 = 112;
  73.     value.loss = 50;
  74.         m.insert(pair<my_map_key, my_map_value>(t, value));

  75.         t.v2 = 44;
  76.     value.loss = 9;
  77.         m.insert(pair<my_map_key, my_map_value>(t, value));

  78.         t.v2 = 3;
  79.     value.loss = 13;
  80.         m.insert(pair<my_map_key, my_map_value>(t, value));


  81.         // 实现按照map中的value进行排序


  82.         // 第一步:将map中的元素放入到vector中
  83.         vector<PAIR> v(m.begin(), m.end());
  84.         // 第二步:使用sort函数对vecotr中的元素进行排序,自定义比较函数或结构体
  85.         // sort(v.begin(), v.end(), cmpByValue());
  86.         sort(v.begin(), v.end(), cmp_by_value);        // 这个也可以的

  87.         // 打印输出 for-loop-scope 特性
  88.         for (auto i : v)
  89.         {
  90.                 cout << "m.second.loss = " << i.second.loss   << "    m.first.v2 = " << i.first.v2  << endl;
  91.         }

  92.         // 题外话:遍历 map 的两种方式
  93.         /*for_each(m.begin(), m.end(), Display);
  94.        
  95.         for (auto iter = m.begin(); iter != m.end(); ++iter)
  96.         {
  97.                 // 自定义内容 ......
  98.         }*/

  99.         return 0;
  100. }
复制代码


让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-5-5 20:24 , Processed in 0.183550 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表