std::greater 在 std::p riority_queue 中的行为是什么?
What is the behavior of std::greater in std::priority_queue?
当我在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
最后一个元素是最小的元素。
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- "using namespace std;"在C++的作用是什么?
- "std::unique_XXX"命名约定背后的基本原理是什么?
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 当为可变性配置时,boost::heap::d_ary_heap 保留的额外 std::list 的目的是什么?
- 引用 std::any 或 not_yet_in_std::whatever 的惯用方式是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 在 C# 中等效的 std::rotate() 是什么?
- MyType 允许 std::atomic 的确切要求是什么<MyType>?
- std::minstd_rand的界限是什么?
- 向后迭代 std::array 或 std::vector 的正确方法是什么?
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- 通过作为指向 C++ 函数的指针传递来访问 std::array 元素的正确方法是什么?
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- 在 std::visit 中跳过变体类型的一些重载组合的方法是什么?
- 最接近"std::atomic<std::vector>"是什么?
- std::make_array的目的是什么?C++20 还需要吗?
- 将(临时的?)std::string传递给使用它来构造一个接受副本的对象的函数的最佳方法是什么?
- C++20 std::common_reference的目的是什么?