STL map自定义排序规则

一、map自定义排序规则

map中存储的是key-value键值对,默认按照key值从小到大顺序排序。即map只能按照key排序。
pair的排序规则才是先按照key排,再按照value排序。

map<int, string> numAndPosMap{
    { 1, "aaa" },
    { 3, "bbb" },
    { 5, "ccc" },
    { 2, "ddd" },
    { 4, "eee" },  
};
1 aaa
2 ddd
3 bbb
4 eee
5 ccc
1. 默认排序规格

std标准库中带有less<>greater<>排序规则。

  • 指定less排序
map<int, string, less<int>> numAndPosMap{
    { 1, "aaa" },
    { 3, "bbb" },
    { 5, "ccc" },
    { 2, "ddd" },
    { 4, "eee" },  
};
1 aaa
2 ddd
3 bbb
4 eee
5 ccc
  • 指定greater排序
map<int, string, greater<int>> numAndPosMap{
    { 1, "aaa" },
    { 3, "bbb" },
    { 5, "ccc" },
    { 2, "ddd" },
    { 4, "eee" },  
};
5 ccc
4 eee
3 bbb
2 ddd
1 aaa
2. 修改按key排序规格

当key为自定义数据时,默认的排序规则就会失效,需要重写针对自定义数据的排序规则。

  • 在数据结构内重载比较运算符
struct MyKey {
    int num;
    string name;
    bool operator< (const MyKey& key) const
    {
        if (name < key.name) {
            return true;
        } else if (name > key.name) {
            return false;
        }

        return num < key.num;
    }
};
using KeyType = MyKey;

template<typename T>
void ShowVectorElem(T elems)
{   
    cout << "size: " << elems.size() << endl;
    for (const auto& elem : elems) {
        cout << elem.first.num << " " << elem.first.name << " " << elem.second << endl;
    }
}

int main() 
{
    map<KeyType, string, less<KeyType>> numAndPosMap{
        { { 1, "aaa" }, "ee"},
        { { 3, "bbb" }, "dd"},
        { { 5, "ccc" }, "cc"},
        { { 2, "ddd" }, "bb"},
        { { 4, "eee" }, "aa"},
    };

    ShowVectorElem(numAndPosMap);
    return 0;
}
1 aaa ee
3 bbb dd
5 ccc cc
2 ddd bb
4 eee aa
  • 重新写排序函数
struct MyKey {
    int num;
    string name;
};
using KeyType = MyKey;

ostream& operator<< (ostream& out, const MyKey& key)
{
    out << key.num << " - " << key.name;
    return out;
}

template<typename T>
void ShowVectorElem(T elems)
{   
    cout << "size: " << elems.size() << endl;
    for (const auto& elem : elems) {
        cout << elem.first << " " << elem.second << endl;
    }
}

int main() 
{
    auto cmp = [](const KeyType& a, const KeyType& b){
        if (a.name < b.name) {
            return true;
        } else if (a.name > b.name) {
            return false;
        }
        return a.num < b.num;
    };

    map<KeyType, string, decltype(cmp)> numAndPosMap(cmp);
    numAndPosMap.insert({ { 1, "aaa" }, "ee"});
    numAndPosMap.insert({ { 3, "bbb" }, "dd"});
    numAndPosMap.insert({ { 5, "ccc" }, "cc"});
    numAndPosMap.insert({ { 2, "ddd" }, "bb"});
    numAndPosMap.insert({ { 4, "eee" }, "aa"});

    ShowVectorElem(numAndPosMap);
    return 0;
}
size: 5
1 - aaa ee
3 - bbb dd
5 - ccc cc
2 - ddd bb
4 - eee aa
3. 修改按value排序规则

map没有随机迭代器,不能使用sort函数。如果需要对value排序,可以再建立一个以value为key的map(类似双映射)。
或者将map数据导入到可以使用sort的容器中,如vector中。

二、参考资料

STL map自定义排序

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值