队列
队列在外面生活中很常见,例如排队结账,付款等。那么我们不难发现,队列存在一种特性,就是先进先出(FIFO)。
常见函数
std::queue<int> Q;//代码中已经声明了队列
Q.push();//向队列队尾添加一个新的元素
Q.pop();//移除队列的第一个元素
Q.front();//返回队列中的第一个元素,通常和q.pop()一起用
Q.back();//返回队列最后一个元素
Q.empty();//检查队列是否为空
Q.size();//返回队列的元素的个数
优先队列
优先队列的本质是基于堆数据结构实现的。
std::priority_queue 是作为一个容器适配器提供的,它通常通过最大堆来实现。堆是一种特别的完全二叉树,它的每一个节点都满足堆性质——节点的键值总是不大于其父节点的键值(这称为最大堆)或不小于其父节点的键值(这称为最小堆)
优先队列保证了队列的第一个元素始终是最大的元素(或者是最小的,这取决于如何定义比较函数)。当需要快速访问最大元素,但不需要整个队列都是有序的时候,优先队列是非常有用的。
常见操作函数
Q.push();//向优先队列中添加元素。
Q.pop();//移除队列中最大的元素(位于队列的前端)。
Q.top();//访问队列中最大的元素,不移除它。
Q.empty();//检查队列是否为空。
Q.size();//返回队列中的元素数量。
注意哦,这里取头是q.top(),不是q.front();
在默认情况下 std::priority_queue 使用最大堆实现,使得最大的元素总是位于队列的前端。如果要改变,在简单的情况下使用 std::greater<T> 来实现最小堆,使得最小的元素位于前端,其中T是数据类型。
我们也可以通过提供自定义的比较函数来改变排序准则。以下是通过使用函数对象定义比较函数。
一般数据类型
#include <iostream>
#include <queue>
struct Compare {
bool operator()(int a, int b) {
return a > b; // 队列头部是最小
}
};
int main() {
// 使用自定义比较器初始化优先队列,记得要在这里吧Compare类作为参数
std::priority_queue<int, std::vector<int>, Compare> pq;
// 向优先队列中添加元素
pq.push(30);
pq.push(20);
pq.push(50);
pq.push(40);
// 依次取出元素,应该按从小到大的顺序输出
while (!pq.empty()) {
std::cout << pq.top() << " ";
pq.pop();
}
return 0;
}
结构体数据类型
#include<bits/stdc++.h>
struct Employee {
std::string name;
int salary;
//构造函数
Employee(std::string n, int s) : name(n), salary(s) {}
};
struct CompareEmployee {
bool operator()(const Employee& e1, const Employee& e2) {
// 返回 true 如果 e1 的薪水小于 e2 的薪水
return e1.salary < e2.salary; // 高薪水优先
}
};
int main() {
// 创建优先队列,使用我们的比较函数
std::priority_queue<Employee, std::vector<Employee>, CompareEmployee> pq;
// 向优先队列添加员工
pq.push(Employee("Alice", 50000));
pq.push(Employee("Bob", 70000));
pq.push(Employee("Charlie", 60000));
// 输出队列中的员工,从薪水最高的开始
while (!pq.empty()) {
Employee e = pq.top();
pq.pop();
std::cout << e.name << " earns $" << e.salary << std::endl;
}
return 0;
}
构造函数定义:
Employee(std::string n, int s) : name(n), salary(s) {}
这一行是 Employee 结构体的构造函数。构造函数是一个特殊的成员函数,当创建结构体或类的对象时会自动调用。
参数:构造函数接受两个参数string n 和 int s。
初始化列表语法 :
name(n), salary(s) 是初始化列表,name(n)表示用参数n的值来初始化成员name,salary(s)表示使用s来初始化成员变量salary。
题目列表
I-礼物商店_第二届“重科杯”重庆科技大学程序设计竞赛 (nowcoder.com)
题解
优先队列的题解-CSDN博客https://blog.csdn.net/gege_0606/article/details/139137821?spm=1001.2014.3001.5501