|
结构体作为有序map的key,再用value来排序
- #include<iostream>
- #include<cstdlib>
- #include<vector>
- #include<algorithm>
- #include<map>
- using namespace std;
- // 结构体作为有序map的key,再用value来排序
- typedef struct my_map_key
- {
- int v1;
- int v2;
- // 基于v2的大小进行比较
- bool operator<(my_map_key const& t) const
- {
- if (this->v2 > t.v2)
- {
- return true;
- }
- return false;
- }
- } my_map_key;
- // 自定义map打印函数:使用for_each遍历打印
- inline void Display(map<my_map_key, int>::value_type & v)
- {
- cout << v.second << endl;
- }
- // 按照value进行比较
- typedef pair<my_map_key, int> PAIR;
- bool cmp_by_value(const PAIR& v1, const PAIR & v2)
- {
- return v1.second < v2.second;
- }
- // 按照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, int> m;
-
- // 对map中进行元素的插入
- my_map_key t;
- t.v1 = 10;
- t.v2 = 3;
- m.insert(pair<my_map_key, int>(t,1));
-
- t.v2 = -3;
- m.insert(pair<my_map_key, int>(t, 2));
- t.v2 = -2;
- m.insert(pair<my_map_key, int>(t, 7));
- t.v2 = 9;
- m.insert(pair<my_map_key, int>(t, 8));
- t.v2 = 32;
- m.insert(pair<my_map_key, int>(t, 3));
- t.v2 = 13;
- m.insert(pair<my_map_key, int>(t, 4));
- t.v2 = 112;
- m.insert(pair<my_map_key, int>(t, 5));
- t.v2 = 44;
- m.insert(pair<my_map_key, int>(t, 6));
- t.v2 = 3;
- m.insert(pair<my_map_key, int>(t, 2));
- // 实现按照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 = " << i.second << " 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;
- }
复制代码
|
|