📜  C++ 中映射的优先级队列及示例(1)

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

C++ 中映射的优先级队列及示例

优先级队列(Priority Queue)是 C++ 中的一种容器,它以二叉堆的形式实现,支持插入和删除操作,每次插入操作都会将元素插入到合适的位置,并保证队列中的元素按照一定规则排列。

在 C++ 中,STL 库提供了 std::priority_queue 类模板,使得开发者能够快速地使用优先级队列。 std::priority_queue 使用了仿函数(Function Object)的概念来比较元素,可以使用默认仿函数 std::less 进行最大堆的比较,也可以使用 std::greater 进行最小堆的比较。

在映射(Map)中使用优先级队列可以方便的进行元素的排序和筛选。下面是一个使用优先级队列对映射中的元素按照值进行排序的示例代码。

#include <iostream>
#include <map>
#include <queue>

using namespace std;

int main()
{
    // 创建一个 map 容器用于存储字符串和整数的键值对
    map<string, int> score;

    // 向容器中添加数据
    score.insert(make_pair("Alice", 85));
    score.insert(make_pair("Bob", 90));
    score.insert(make_pair("Charlie", 80));
    score.insert(make_pair("David", 95));
    score.insert(make_pair("Emily", 90));

    // 创建一个优先级队列,按照从大到小的顺序进行排序
    priority_queue<pair<int, string>> pq;
    for (auto it : score)
    {
        pq.push(make_pair(it.second, it.first));
    }

    // 输出元素
    while (!pq.empty())
    {
        cout << pq.top().second << ": " << pq.top().first << endl;
        pq.pop();
    }

    return 0;
}

在上面的代码中,我们创建了一个 map 容器用于存储字符串和整数的键值对,然后向容器中添加了一些数据。接着,我们创建了一个优先级队列,并且使用 for 循环向优先级队列中添加了映射中的键值对,使用 make_pair 函数来将 value 和 key 组成一个 pair 对象。最后,我们遍历队列并输出元素。由于默认使用 std::less 进行比较,因此我们得到了按照分数从高到低的输出结果:

David: 95
Bob: 90
Emily: 90
Alice: 85
Charlie: 80

除了使用 pair 来存储映射中的元素,我们还可以自定义一个结构体来存储映射中的键值对。下面是一个自定义结构体的示例代码。

#include <iostream>
#include <map>
#include <queue>
#include <string>

using namespace std;

struct Student {
    string name;
    int score;
};

struct cmp {
    bool operator() (const Student& a, const Student& b) {
        return a.score < b.score;
    }
};

int main()
{
    // 创建一个 map 容器用于存储字符串和整数的键值对
    map<string, int> score;

    // 向容器中添加数据
    score.insert(make_pair("Alice", 85));
    score.insert(make_pair("Bob", 90));
    score.insert(make_pair("Charlie", 80));
    score.insert(make_pair("David", 95));
    score.insert(make_pair("Emily", 90));

    // 将 map 容器中的元素转换为 Student 结构体
    priority_queue<Student, vector<Student>, cmp> pq;
    for (auto it : score)
    {
        pq.push({ it.first, it.second });
    }

    // 输出元素
    while (!pq.empty())
    {
        auto s = pq.top();
        cout << s.name << ": " << s.score << endl;
        pq.pop();
    }

    return 0;
}

在上面的代码中,我们创建了一个结构体 Student 来存储映射中的键值对,其中包含了学生的名字和分数。我们还创建了一个 cmp 结构体,用于定义优先队列的比较方式。在 main 函数中创建了一个 priority_queue 容器,并向其中添加了所有的映射元素。最后,我们也用同样的方式遍历队列并输出元素。

总结:C++ 的 std::priority_queue 提供了优先级队列的支持,可以方便的对元素进行排序和筛选。在映射中使用优先级队列可以快速地将映射中的元素排序或筛选。