当我在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
成员函数首先返回最小的数字?
(我需要在两种情况之间进行明确的比较)。
答案 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
最后一个元素是最小元素。