东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[C/C++] 结构体作为有序map的key,再用value来排序

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

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



结构体作为有序map的key,再用value来排序


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

  7. // 结构体作为有序map的key,再用value来排序

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

  12.         // 基于v2的大小进行比较
  13.         bool operator<(my_map_key const& t) const
  14.         {
  15.                 if (this->v2 > t.v2)
  16.                 {
  17.                         return true;
  18.                 }
  19.                 return false;       
  20.         }
  21. } my_map_key;

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

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

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

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

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

  54.         t.v2 = -2;
  55.         m.insert(pair<my_map_key, int>(t, 7));

  56.         t.v2 = 9;
  57.         m.insert(pair<my_map_key, int>(t, 8));

  58.         t.v2 = 32;
  59.         m.insert(pair<my_map_key, int>(t, 3));

  60.         t.v2 = 13;
  61.         m.insert(pair<my_map_key, int>(t, 4));

  62.         t.v2 = 112;
  63.         m.insert(pair<my_map_key, int>(t, 5));

  64.         t.v2 = 44;
  65.         m.insert(pair<my_map_key, int>(t, 6));

  66.         t.v2 = 3;
  67.         m.insert(pair<my_map_key, int>(t, 2));


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


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

  74.         // 打印输出 for-loop-scope 特性
  75.         for (auto i : v)
  76.         {
  77.                 cout << "m.second = " << i.second   << "    m.first.v2 = " << i.first.v2  << endl;
  78.         }

  79.         // 题外话:遍历 map 的两种方式
  80.         /*for_each(m.begin(), m.end(), Display);
  81.        
  82.         for (auto iter = m.begin(); iter != m.end(); ++iter)
  83.         {
  84.                 // 自定义内容 ......
  85.         }*/

  86.         return 0;
  87. }
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 03:57 , Processed in 0.165872 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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