|
两个结构体,用有序map进行关联,同时根据value结构体的某key排序
- #include<iostream>
- #include<cstdlib>
- #include<vector>
- #include<algorithm>
- #include<map>
- using namespace std;
- // 两个结构体,用有序map进行关联,同时根据value结构体的某key排序
- typedef struct my_map_key
- {
- int v1;
- int v2;
- // 基于v2的大小进行比较 需要排序啊 这是有序map啊
- bool operator<(my_map_key const& other) const
- {
- return this->v2 <= other.v2; // 从小到大排序比较
- }
- } my_map_key;
- typedef struct my_map_value
- {
- float loss;
- int num;
- } my_map_value;
- // // 自定义map打印函数:使用for_each遍历打印
- // inline void Display(map<my_map_key, int>::value_type & v)
- // {
- // cout << v.second << endl;
- // }
- // 按照value进行比较
- typedef pair<my_map_key, my_map_value> PAIR;
- bool cmp_by_value(const PAIR& v1, const PAIR & v2)
- {
- return v1.second.loss < v2.second.loss;
- }
- // 按照value进行比较
- // struct cmpByValue
- // {
- // bool operator()(const PAIR& v1, const PAIR& v2)
- // {
- // return v1.second < v2.second;
- // }
- // };
- int main()
- {
- // 提示:对于有序map来说,如果key没有重载<操作符,是无法插入成功的。因此,对于自定义类型的key,必须实现<操作符重载
- map<my_map_key, my_map_value> m;
-
-
- // 对map中进行元素的插入
- my_map_key t;
- my_map_value value;
- t.v1 = 10;
- t.v2 = 3;
- value.loss = 10;
- value.num = 100;
- m.insert(pair<my_map_key, my_map_value>(t,value));
-
- t.v2 = -3;
- value.loss = 2;
- m.insert(pair<my_map_key, my_map_value>(t, value));
- t.v2 = -2;
- value.loss = 20;
- m.insert(pair<my_map_key, my_map_value>(t, value));
- t.v2 = 9;
- value.loss = 8;
- m.insert(pair<my_map_key, my_map_value>(t, value));
- t.v2 = 32;
- value.loss = 0;
- m.insert(pair<my_map_key, my_map_value>(t, value));
- t.v2 = 13;
- value.loss = 90;
- m.insert(pair<my_map_key, my_map_value>(t, value));
- t.v2 = 112;
- value.loss = 50;
- m.insert(pair<my_map_key, my_map_value>(t, value));
- t.v2 = 44;
- value.loss = 9;
- m.insert(pair<my_map_key, my_map_value>(t, value));
- t.v2 = 3;
- value.loss = 13;
- m.insert(pair<my_map_key, my_map_value>(t, value));
- // 实现按照map中的value进行排序
- // 第一步:将map中的元素放入到vector中
- vector<PAIR> v(m.begin(), m.end());
- // 第二步:使用sort函数对vecotr中的元素进行排序,自定义比较函数或结构体
- // sort(v.begin(), v.end(), cmpByValue());
- sort(v.begin(), v.end(), cmp_by_value); // 这个也可以的
- // 打印输出 for-loop-scope 特性
- for (auto i : v)
- {
- cout << "m.second.loss = " << i.second.loss << " m.first.v2 = " << i.first.v2 << endl;
- }
- // 题外话:遍历 map 的两种方式
- /*for_each(m.begin(), m.end(), Display);
-
- for (auto iter = m.begin(); iter != m.end(); ++iter)
- {
- // 自定义内容 ......
- }*/
- return 0;
- }
复制代码
|
|