队列 : 先进先出,按照我们添加元素的顺序来决定
优先级队列 : 并不是按照元素的添加顺序来访问,而是按照优先级来访问
// 2. 优先级队列存储基本数据类型
void test01()
{
priority_queue<int> queue1;
// 用另外一个容器中元素初始化优先级队列
vector<int> v = { 10, 9, 2, 1, 8 };
priority_queue<int> queue2(v.begin(), v.end());
}
struct MyCompare
{
bool operator()(int v1, int v2)
{
return v1 < v2;
}
};
void test02()
{
// 创建空的优先级队列 : 默认从大到小排序
// priority_queue<int> q;
// 设置优先级队列从小到大排序
// 第一个模板参数:表示的是容器元素的类型
// 第二个模板参数:实现的底层容器
// 第三个模板参数:来指定优先级的比较规则
// priority_queue<int, vector<int>, greater<int>> q;
// 也可以使用自定义的函数对象来设置模板的第三个参数
priority_queue<int, vector<int>, MyCompare> q;
// 向队列中添加元素
q.push(8);
q.push(7);
q.push(4);
q.push(5);
q.push(6);
// 访问优先级队列中的元素
while (!q.empty())
{
// 优先级队列只有一种访问元素的方式,就是谁的优先级高就先访问哪个元素
// 使用 top 函数返回优先级最高的元素
cout << q.top() << endl;
// pop 函数删除优先级最高的元素
q.pop();
}
// 对于基本数据类型,优先级队列按照降序排列规则,将所有的元素进行排序。
// 所谓的优先级队列内部比普通队列多了一个排序的规则,默认从大到小去访问。
}
// 3. 优先级队列存储自定义类型
class Person
{
public:
Person(string name, int priority)
{
m_name = name;
m_priority = priority;
}
#if 0
bool operator<(const Person& person) const
{
return m_priority < person.m_priority;
}
#endif
public:
string m_name;
int m_priority;
};
struct MyComparePerson
{
bool operator()(const Person& p1, const Person& p2)
{
return p1.m_priority < p2.m_priority;
}
};
struct MyComparePerson2
{
bool operator()(const Person& p1, const Person& p2)
{
return p1.m_priority > p2.m_priority;
}
};
void test03()
{
// 1. 给 Person 重载 operator< 函数
// 2. 给优先级队列的模板参数的第三个参数设置一个能够进行 Person 类型对象比较的函数对象
// priority_queue<Person, vector<Person>, MyComparePerson> q;
// 如果希望优先级队列能够根据某个属性从小到大排序
// 1. 给优先级队列的模板参数指定第三个参数 greater<Person>, 并且在 Person 中重载 operator> 函数
// 2. 给优先级队列模板的第三个参数指定一个比较函数对象
priority_queue<Person, vector<Person>, MyComparePerson2> q;
// 插入元素有两种,第一种创建一个对象存储到容器中,第二种,让容器帮我们构建对象再进行存储
q.push(Person("smith", 1));
q.emplace("obama", 7);
q.emplace("polly", 5);
while (q.size() > 0)
{
// 访问优先最高的人
const Person& person = q.top();
cout << person.m_name << " " << person.m_priority << endl;
// 从队列中删除当前元素
q.pop();
}
}

冀公网安备13050302001966号