std :: priority_queue中std :: greater的行为是什么?

时间:2018-04-08 23:41:34

标签: c++ stl heap priority-queue

当我在std::greater<int>中使用std::sort作为比较函数对象时,如下所示:

std::sort(array_name, array_name + length, std::greater<int>());

数组以非递增顺序排序(即最大数字首先)

但是,当我在std::priority_queue中使用相同的比较函数时,如下所示:

std::priority_queue <int, std::vector<int>, std::greater<int> > pq_name;

为什么std::priority_queue::top成员函数首先返回最小的数字?

(我需要在两种情况之间进行明确的比较)。

2 个答案:

答案 0 :(得分:3)

为了理解为什么会发生这种情况,您必须了解您正在使用的数据结构。

问:什么是数组? A:数组是包含类型的连续内存区域。就我们而言,它可以包含任何类型的对象。但是因为你正在使用int,所以在C ++中,一个整数由32位组成,但它取决于它。因此,你在记忆中的表现就像是,

| 4 bytes | 4 bytes | 4 bytes | (...)

当您对数组进行排序时,std::greater<int>运算符将通过在第一个位置保持较大的整数,在第二个位置保持第二个最大值来“排序”数组,依此类推。

问:什么是std::priority_queue A:优先级队列是堆,更具体地说是二叉树。堆是一种优化的数据结构,默认情况下返回最大值。这种类型的堆被称为最大堆。但是当您使用priority_queue运算符重载std::greater内的比较时,您正在将堆转换为 min heap 。与重载std::sort方法运算符时发生的情况类似,这种堆实现为首先检索最小值。

请记住,内存中堆的表示与数组中的堆完全不同。

答案 1 :(得分:2)

CPPRef says on it

  

可以提供用户提供的比较来更改排序,例如使用std :: greater会导致最小元素显示为top()。

     

请注意,Compare参数的定义使得如果第一个参数位于弱排序的第二个参数之前,则返回true。但是因为优先级队列首先输出最大的元素,所以&#34;之前的元素是&#34;实际上输出最后。也就是说,队列的前面包含&#34; last&#34;元素根据Compare强加的弱序排列。

因此,对于基于默认std::less的排序,队列的顶部是最大元素,即排序时最后一个元素。 OTOH与std::greater最后一个元素是最小元素。