c++ map按key或value的值分别进行排序

一、对key值进行特定的排序

map容器里面有两个值一个key一个是value,map<key,value>,其实map里面还有第三个参数,是一个类,用来对map的key进行排序的类,定义如下

template<class _Kty,
    class _Ty,
    class _Pr = less<_Kty>,
    class _Alloc = allocator<pair<const _Kty, _Ty> > >
    class map

less<_Kty>的代码

struct less
        : public binary_function<_Ty, _Ty, bool>
    {    // functor for operator<
    bool operator()(const _Ty& _Left, const _Ty& _Right) const
        {    // apply operator< to operands
        return (_Left < _Right);
        }
    };

那么根据上面的代码我们也可以写出一个greater类来让key按照降序排列

#include <iostream>
#include <string>
#include <map>
using namespace std;

typedef pair<string, int> PAIR;

struct greater
{
    bool operator()(const string& _Left, const string& _Right) const
    {
        return (_Left > _Right);
    }
};

int main()
{
    map<string, int,greater> ma;
    ma["Alice"] = 86;
    ma["Bob"] = 78;
    ma["Zip"] = 92;
    ma["Stdevn"] = 88;
    for (map<string, int>::iterator ite = ma.begin(); ite != ma.end(); ++ite)
    {
        cout << ite->first << " " << ite->second << endl;
    }
    getchar();
}

默认的排序和用greater进行的排序分别如下

以上就对key值进行了你想要的排序方式。

二、对value的值进行排序

因为map的模板里面没有对value的值进行排序的参数,所以只能借助sort函数,然而sort函数只能对vector,list,queue等排序,无法对map排序,那么就需要把map的值放入vector中在对vector进行排序,在对vector进行输出,从而间接实现了对map的排序。sort也有第三个参数,跟上面那个map类似,所以可以写一个类或者函数来将其排序。

#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;

typedef pair<string, int> PAIR;

bool cmp_val(const PAIR &left,const PAIR &right)
{
    return left.second < right.second;
}

int main()
{
    map<string, int> ma;
    ma["Alice"] = 86;
    ma["Bob"] = 78;
    ma["Zip"] = 92;
    ma["Stdevn"] = 88;
    vector<PAIR> vec(ma.begin(),ma.end());
    sort(vec.begin(),vec.end(),cmp_val);
    for (vector<PAIR>::iterator ite = vec.begin(); ite != vec.end(); ++ite)
    {
        cout << ite->first << " " << ite->second << endl;
    }
    getchar();
}

结果如下

这样就通过cmp_val函数对vector进行了排序,然后在将其输出即可。

如果感觉写函数过于繁琐也可以直接在sort里面用lambda表达式,代码如下

#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;

typedef pair<string, int> PAIR;

int main()
{
    map<string, int> ma;
    ma["Alice"] = 86;
    ma["Bob"] = 78;
    ma["Zip"] = 92;
    ma["Stdevn"] = 88;
    vector<PAIR> vec(ma.begin(),ma.end());
    sort(vec.begin(), vec.end(),[](const PAIR &left, const PAIR &right)
    {
        return left.second < right.second;
    });
    for (vector<PAIR>::iterator ite = vec.begin(); ite != vec.end(); ++ite)
    {
        cout << ite->first << " " << ite->second << endl;
    }
    getchar();
}
时间: 2024-10-06 11:38:06

c++ map按key或value的值分别进行排序的相关文章

Map&lt;Key,Value&gt;基于Value值排序

Map<Key,Value> 排序默认是按照KEY值的升序来进行. 针对按照Value来进行排序有两种方法: 第一种 使用TreeMap  代码如下 public class test{ public static void main(String[] args) { HashMap<String, Double> map = new HashMap<String, Double>(); valueComparator vComparator = new valueCo

Map去重,去重value相同的元素,保留key最小的那个值

Map<Integer,String>,Integer代表时间撮,String代表文本信息去重函数:就是删除Map中value相同的元素,只保留key最小的那个元素 public static Map<Integer,String> RemoveRepFromMap(Map<Integer,String> map){ Set<Entry<Integer,String>> set = map.entrySet(); List<Entry<

Java Map按键(Key)排序和按值(Value)排序

Map排序的方式有很多种,两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value).1.按键排序jdk内置的java.util包下的TreeMap<K,V>既可满足此类需求,向其构造方法 TreeMap(Comparator<? super K> comparator)  传入我们自定义的比较器即可实现按键排序. Java代码   public class MapSortDemo { public static void main(Strin

Java中Map根据键值(key)或者值(value)进行排序实现

我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Key是唯一的,而value不唯一.Map是一个接口,我们不能 直接声明一个Map类型的对象,在实际开发中,比较常用的Map性数据结构是HashMap和TreeMap,它们都是Map的直接子类.如果考虑到存取 效率的话,建议使用HashMap数据结构,而如果需要考虑到Key的顺序,建议使用TreeMap,但是

Java集合篇六:Map中key值不可重复的测试

package com.test.collection; import java.util.HashMap; import java.util.Map; //Map中key值不可重复的测试 public class TestEquals { public static void main(String[] args) { String s1=new String("abc"); String s2=new String("abc"); Map map=new Has

STL map 按key值和按value值排序

map是用来存放<key, value>键值对的数据结构,能够非常方便高速的依据key查到对应的value. 假如存储水果和其单位价格.我们用map来进行存储就是个不错的选择. 我们这样定义.map<string, double>.当中水果用string类型.作为Key:该水果的单位价格用double类型,作为value. 这样一来,我们能够依据水果名高速的查找到价格. 我们不仅要将水果和相应的价格输出,还想知道依照价格高低进行排序的结果. 换句话说,我们希望可以对map进行按Ke

springboot中处理mybatis返回Map时key值的大小写

为了统一不同数据库返回key值大小写不一致的问题,特自定义ObjectWrapperFactory来做统一的处理 1,首先自定义MapWrapper /** * 将Map的key全部转换为小写 * */ public class MapKeyLowerWrapper extends MapWrapper { public MapKeyLowerWrapper(MetaObject metaObject, Map<String, Object> map) { super(metaObject,

C++基础之map按key排序

在项目当中有要用到map按key排序的需求,就在百度上搜了一下: typedef pair<int,int> PAIR; int cmp(const PAIR& x, const PAIR& y) { return x.second < y.second; } map<int,int> imgdis; //待排序对象,根据double值排序 imgdis[1] = 3; imgdis[10] = 1; imgdis[3] = 5; imgdis[12] = 4

Java基础知识强化之集合框架笔记52:Map集合之Map集合的遍历 键找值

1. Map集合的遍历  Map -- 夫妻对 思路:  A:把所有的丈夫给集中起来.  B:遍历丈夫的集合,获取得到每一个丈夫.  C:让丈夫去找自己的妻子.  转换:  A:获取所有的键  B:遍历键的集合,获取得到每一个键  C:根据键去找值 2. 代码示例: 1 package cn.itcast_01; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 import java.util.Set; 6 7 public cla