STL中priority_queue
STL 中的 priority_queue priority_queue 是 STL 中的一种容器,可以实现优先级队列的功能。下面,我们将详细介绍 priority_queue 的使用方法和实现原理。 priority_queue 的基本概念 priority_queue 是一种特殊的队列,它可以自动对元素进行排序,使得队列中最大的元素总是位于队首。这种特性使得 priority_queue 十分适合解决许多实际问题,例如排队、调度、优先级处理等。 priority_queue 的使用方法 使用 priority_queue 需要包含头文件 `<queue>`,并使用 `std::priority_queue` 类模板。下面是一个简单的示例: ```cpp #include <queue> #include <iostream> using namespace std; int main() { priority_queue<float> q; q.push(66.6); q.push(22.2); q.push(44.4); cout << q.top() << ' '; q.pop(); cout << q.top() << endl; q.pop(); return 0; } ``` 在上面的示例中,我们首先创建了一个 `priority_queue` 对象 `q`,然后使用 `push` 方法将三个浮点数元素插入队列中。接下来,我们使用 `top` 方法读取队首元素,并使用 `pop` 方法删除队首元素。 priority_queue 的实现原理 priority_queue 的实现原理是基于堆排序算法的。堆是一种特殊的树形结构,它满足以下两个性质: 1. 父节点的值总是大于或等于其孩子节点的值。 2. 堆是一个完全二叉树。 在 priority_queue 中,每个元素都是一个节点,节点的值是元素的值。堆的根节点是队列中最大的元素,所有节点都是其父节点的孩子节点。插入元素时,priority_queue 会将新元素插入到队尾,然后使用堆排序算法来维护堆的性质。删除元素时,priority_queue 会将队首元素删除,然后使用堆排序算法来维护堆的性质。 自定义priority_queue的比较规则 priority_queue 的比较规则可以通过重载 `<` 操作符来修改。例如,我们可以定义一个结构体 `info`,并重载 `<` 操作符来按照 `score` 字段进行排序: ```cpp #include <queue> #include <string> #include <iostream> using namespace std; struct info { string name; float score; bool operator < (const info &a) const { return a.score < score; } }; int main() { priority_queue<info> pq; info in; in.name = "Jack"; in.score = 68.5; pq.push(in); in.name = "Bomi"; in.score = 18.5; pq.push(in); in.name = "Peti"; in.score = 90; pq.push(in); while (!pq.empty()) { cout << pq.top().name << ": " << pq.top().score << endl; pq.pop(); } return 0; } ``` 在上面的示例中,我们定义了一个结构体 `info`,其中包含 `name` 和 `score` 两个字段。我们重载了 `<` 操作符,使得 priority_queue 按照 `score` 字段进行排序。 总结 priority_queue 是 STL 中的一种重要容器,它可以实现优先级队列的功能。使用 priority_queue 需要包含头文件 `<queue>`,并使用 `std::priority_queue` 类模板。priority_queue 的实现原理是基于堆排序算法的,可以通过重载 `<` 操作符来修改比较规则。