c++ map 的key可是是一个类吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ map 的key可是是一个类吗相关的知识,希望对你有一定的参考价值。

C++ map的键类型可以是一个类,比如键类型可以是C++标准库中的string类,但是对作为键的类有一个约束,那就是这个类必须定义小于操作符,也就是要重载小于运算操作符(C++标准库的string类就定义了小于操作符)。而且这个小于操作符比较函数还必须符合“严格弱排序”,简单来说就是:与自身比较时返回false,当两个键对象不存在小于关系,就视为相等;k1小于k2,k2小于k3,则k1必然小于k3。 参考技术A 可以,不过要重载比较运算操作符

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();
}

 

以上是关于c++ map 的key可是是一个类吗的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 C++ 中有一个静态类吗?

使用例子解释C++中的map容器

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

你能在 C++ 中保护嵌套类吗?

C++ 标准库必须支持那些挑剔朋友是谁的类吗?

c++ unordered_map 自定义key