在C++中打印对的优先级队列的所有值时出现问题

Problem to print all values of Priority queue of pairs in C++

本文关键字:问题 队列 C++ 打印 优先级      更新时间:2023-10-16

这是打印优先级队列的第二个元素(对(的功能:

void show(priority_queue <pair<int,string>> pq)
{
priority_queue <pair<int,string>> tmp=pq;
while (!tmp.empty())
{
cout<<tmp.top().second<<endl;
tmp.pop();
}
}

输入值为:

1 www.youtube.com 
2 www.google.com 
3 www.google.com.hk
10 www.alibaba.com 
5 www.taobao.com 
10 www.bad.com 
7 www.good.com 
8 www.fudan.edu.cn 
9 www.university.edu.cn 
10 acm.university.edu.cn

我知道它应该按照第一个元素降序排序,当两个元素相同时,它会保留我首先输入的元素。

它应该先打印"www.alibaba.com",然后打印"www.bad.com",然后打印"acm.university.edu.cn",因为所有值的第一个值是 10。

但它首先打印"www.bad.com",然后打印"www.alibaba.com",然后打印"acm.university.edu.cn"等等。这里有什么问题?

std::pair比较运算符使用字典比较。

对于两对p1p2,这意味着如果p1.first == p2.first则比较p1.second < p2.second。因此,顺序将是"最大"second"最小"(因为优先级队列会反向排序(。

如果要自定义比较,则可以为队列提供自定义"小于"函数。例如,一个不比较该对second成员(但我认为顺序将是不确定的(。

@Someprogrammerdude提供的答案是正确的。为了更详细地解释原因,如果您打印该对的两个成员,以下是完整的输出:

10, www.bad.com
10, www.alibaba.com
10, acm.university.edu.cn
9, www.university.edu.cn
8, www.fudan.edu.cn
7, www.good.com
5, www.taobao.com
3, www.google.com.hk
2, www.google.com
1, www.youtube.com

如果我们使用更简单的数据集(1-4 与 a,b,c 配对(,也许会更明显:

4, c
4, b
4, a
3, c
3, b
3, a
2, c
2, b
2, a
1, c
1, b
1, a

缺失的部分可以由 cppreference.com 提供 - priority_queue(由我强调(

优先级队列是提供恒定时间的容器适配器 查找最大的(默认情况下(元素,代价是 对数插入和提取。

可以提供用户提供的比较来更改顺序,例如 使用 std::greater 将导致最小元素显示为 顶部((。