东方耀AI技术分享
标题:
结构体作为有序map的key,再用value来排序
[打印本页]
作者:
东方耀
时间:
2021-12-7 13:21
标题:
结构体作为有序map的key,再用value来排序
结构体作为有序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;
}
复制代码
欢迎光临 东方耀AI技术分享 (http://www.ai111.vip/)
Powered by Discuz! X3.4