Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::priority_队列使用最大堆而不是最小堆?_C++_Stl_Priority Queue - Fatal编程技术网

C++ 为什么std::priority_队列使用最大堆而不是最小堆?

C++ 为什么std::priority_队列使用最大堆而不是最小堆?,c++,stl,priority-queue,C++,Stl,Priority Queue,我一直想知道为什么STL优先级队列默认使用最大堆而不是最小堆。 我想到的两个明显的用例是寻路(Dijkstra)和构建哈夫曼代码。 这两种算法都需要先提取最小元素。 由于排序(std::sort)默认使用升序, 我想知道优先级队列背后的设计原因是什么, 因为默认情况下我更喜欢一个MIN堆。是有原因的,但它是与C++的连接特性有关的。 priority\u queue被设计成一个围绕make\u heap、pop\u heap和push\u heap的易于使用的包装器。堆函数将最大值放在前面是有意

我一直想知道为什么STL优先级队列默认使用最大堆而不是最小堆。 我想到的两个明显的用例是寻路(Dijkstra)和构建哈夫曼代码。 这两种算法都需要先提取最小元素。 由于排序(std::sort)默认使用升序, 我想知道优先级队列背后的设计原因是什么,
因为默认情况下我更喜欢一个MIN堆。

是有原因的,但它是与C++的连接特性有关的。

priority\u queue
被设计成一个围绕
make\u heap
pop\u heap
push\u heap
的易于使用的包装器。堆函数将最大值放在前面是有意义的,因为这是实现
sort\u heap
所需要的,它也使用堆函数


当然,您始终可以使用
更大的
而不是
更少的
来实例化
优先级队列
,以获得所需的行为。

优先级队列是从make\u heap/pop\u heap/push\u heap/sort\u heap改编而来的。当您使用更少的元素创建_堆时,元素将按升序排序。最后一个元素被视为根元素。所以这就是max heap。我想有两个原因:

  • 在所有默认STL排序中,我们总是使用较少的
  • push_back()或pop_back()比push_front()或pop_front()更有效

  • 在英语中,优先权更大的事情应该首先发生。因此,在优先级队列中,应该首先弹出具有更高优先级的内容

    基本上,你的问题的答案是因为单词priority的定义强烈地暗示了从最大到最小的顺序


    想象一下像医院大厅一样的优先队列。最优先(紧急情况)的患者应排在治疗队列的最前面

    因为它基本上是一个优先级队列,而不是一个堆。可能是因为在优先级队列中,您希望优先级更高的项目排在第一位,但我同意这不是一个经过深思熟虑的设计(因为它实际上要求每个人向后实现其比较器)。让某种优先级对象实现它的比较运算符,使较高优先级的值“小于”较低优先级的值,这会更有意义。@MichaelAaronSafyan:甚至“优先级”也令人困惑,因为人们说“此任务是优先级1”,他们的意思是“先做”而不是“最后做”外行对优先权的理解是,“最高”优先权是最小的数字,“第二”优先权紧随其后。。。。我同意OP的说法,在STL中所做的选择似乎很愚蠢,但也许这里没有人真正知道为什么会这样做。那么,为什么默认情况下
    make_heap
    make max heap而不是min heap?实际上,
    sort\u heap
    可以通过max heap或min heap实现。