📜  C++ STL的Map和Multimap中的降序(1)

📅  最后修改于: 2023-12-03 14:59:47.239000             🧑  作者: Mango

C++ STL中的Map和Multimap的降序排列

在C++ STL中,Map和Multimap是两个非常有用的容器,它们都是关联式容器(Associative Containers)。它们通过键-值对的方式进行存储,并可以通过键(key)来快速地查询对应的值(value)。Map和Multimap的区别是:Map中每个键只能对应一个值,而Multimap中一个键可以对应多个值。

Map和Multimap中的默认排序是按键的升序排列,但是在实际情况中,我们有时需要进行降序排列。C++ STL提供了一种非常简单的方法来实现这一点。下面是具体的介绍。

使用greater进行降序排列

在C++ STL中,Map和Multimap的排序方式可以通过第三个模板参数来指定,默认情况下为升序排列,可以指定为std::less,其中T为键的类型。如果需要进行降序排列,可以指定为std::greater

以下是示例代码:

#include <iostream>
#include <map>

int main() {
    std::map<int, int, std::greater<int>> myMap;

    myMap[1] = 10;
    myMap[2] = 20;
    myMap[3] = 30;

    for (auto& p : myMap) {
        std::cout << p.first << " " << p.second << std::endl;
    }

    return 0;
}

在上面的示例代码中,我们创建了一个Map对象myMap,其中键的类型为int,值的类型也为int。第三个模板参数使用了std::greater,表示要按键的降序排列。由于myMap中存储的是键值对,我们可以通过遍历Map对象来输出每对键值对。

输出结果如下:

3 30
2 20
1 10

可以看到,Map中的键是按降序排列的。

使用自定义比较函数进行降序排列

除了使用std::greater进行降序排列外,我们还可以通过自定义比较函数来实现降序排列。自定义比较函数的类型为std::function<bool(const T&, const T&)>,其中T为键的类型,函数返回值为bool类型。

以下是示例代码:

#include <iostream>
#include <map>
#include <functional>

bool Compare(int a, int b) {
    return a > b;
}

int main() {
    std::map<int, int, std::function<bool(const int&, const int&)>> myMap(Compare);

    myMap[1] = 10;
    myMap[2] = 20;
    myMap[3] = 30;

    for (auto& p : myMap) {
        std::cout << p.first << " " << p.second << std::endl;
    }

    return 0;
}

在上面的示例代码中,我们定义了一个自定义比较函数Compare,它的作用是将两个int类型的参数进行比较,返回较大的那个数。

然后我们创建了一个Map对象myMap,指定了第三个模板参数为std::function<bool(const int&, const int&)>,并将自定义比较函数作为构造参数传入。

输出结果如下:

3 30
2 20
1 10

同样可以看到,键是按降序排列的。

使用Multimap进行降序排列

除了Map之外,Multimap也可以进行降序排列。Multimap与Map的区别在于:Map中一个键只能对应一个值,而Multimap中一个键可以对应多个值。

以下是示例代码:

#include <iostream>
#include <map>

int main() {
    std::multimap<int, int, std::greater<int>> myMultiMap;

    myMultiMap.insert(std::make_pair(1, 10));
    myMultiMap.insert(std::make_pair(2, 20));
    myMultiMap.insert(std::make_pair(3, 30));
    myMultiMap.insert(std::make_pair(3, 40));

    for (auto& p : myMultiMap) {
        std::cout << p.first << " " << p.second << std::endl;
    }

    return 0;
}

在上面的示例代码中,我们创建了一个Multimap对象myMultiMap,其中键的类型为int,值的类型也为int。第三个模板参数使用了std::greater,表示要按键的降序排列。由于myMultiMap中存储的是键值对,我们可以通过遍历Multimap对象来输出每对键值对。

此外,由于Multimap中一个键可以对应多个值,我们在插入键值对时使用了insert函数,并将键值对封装成std::pair对象。

输出结果如下:

3 30
3 40
2 20
1 10

可以看到,键是按降序排列的,如果键相同,则值按插入的顺序输出。

结论

在C++ STL中,Map和Multimap的降序排列非常简单,可以通过指定第三个模板参数为std::greater来实现,也可以通过定义自定义比较函数来实现。Multimap也支持降序排列,不同的是,Multimap中一对键值对中的键可以对应多个值。

// 示例代码
#include <iostream>
#include <map>

int main() {
    std::map<int, std::string, std::greater<int>> myMap;

    myMap[1] = "C++";
    myMap[2] = "STL";
    myMap[3] = "Map";

    for (auto& p : myMap) {
        std::cout << p.first << " " << p.second << std::endl;
    }

    return 0;
}
// 输出结果
3 Map
2 STL
1 C++