在C++中打印对的优先级队列的所有值时出现问题
Problem to print all values of Priority queue of pairs in C++
这是打印优先级队列的第二个元素(对(的功能:
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
比较运算符使用字典比较。
对于两对p1
和p2
,这意味着如果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 将导致最小元素显示为 顶部((。
相关文章:
- 在C++中打印对的优先级队列的所有值时出现问题
- 有关如何处理 vulkan 队列系列的问题
- 我有一个问题,创建了C 中阻塞队列的向量
- 关于使用我自己创建的类使用优先级队列的问题
- 使用队列和列表 STL 进行C++分配。在将数据填充到列表或队列中然后打印该数据时遇到问题
- 我的字符串队列结构有什么问题?
- 队列的同步问题
- 将队列处理为包含文件的文件夹.可能存在的问题
- 使用自定义比较器声明C++优先级队列的问题
- 洗车队列问题
- 语法问题:尝试将节点推送到队列
- 尝试创建队列 - C++崩溃的问题
- 用两个堆栈实现队列——脱队列测试问题
- C++ 我在设置我创建的类的优先级队列时遇到问题
- 将Struct对象推入队列的问题
- Boost库队列的问题
- 我有一个问题,了解如何与队列工作
- 队列的指针问题
- 链表-C++出队问题..出队列重复返回相同的元素
- 对最短路径算法进行建模时的队列问题