std::greater 在 std::p riority_queue 中的行为是什么?

What is the behavior of std::greater in std::priority_queue?

本文关键字:std 是什么 greater riority queue      更新时间:2023-10-16

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

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成员函数首先返回最小的数字?

(我需要在这两种情况之间进行清晰的比较)。

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

问:什么是阵列?一个:数组是包含类型的连续内存区域。就我们而言,它可以包含任何类型的对象。但是由于您使用的是int,因此C++整数通常由32位组成,但这取决于。因此,您在内存中的表示将是这样的,

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

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

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

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

CPPRef 在上面说:

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

请注意,Compare 参数的定义是,如果它的第一个参数在弱排序中位于第二个参数之前,则返回 true。但是,由于优先级队列首先输出最大的元素,因此"之前"的元素实际上是最后输出的。也就是说,队列的前面根据 Compare 强加的弱排序包含"最后一个"元素。

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

相关文章: