解释默认 priority_queue::top() 的行为?

Posted

技术标签:

【中文标题】解释默认 priority_queue::top() 的行为?【英文标题】:Explain behavior of default priority_queue::top()? 【发布时间】:2021-02-13 08:13:10 【问题描述】:

std::priority_queue,默认使用std::vector<int>std::less 比较器。默认情况下,priority_queue 是一个最大堆。

docs for top() 声明:

top 元素是在priority_queue 中比较高的元素,下一个在调用priority_queue::top 时从容器中移除。

此成员函数有效地调用底层容器对象的成员front

因此,一个默认构造的整数 priority_queue 构造如下:

auto maxheap = priority_queue<int>();
maxHeap.push(1);
maxHeap.push(3);
cout << maxHeap.top(); // outputs 3

然而,回到top() 的描述,文档指出,实际上调用了底层容器对象上的成员front。如果我创建一个向量并使用std::less 进行排序来模拟我们的maxHeap 的底层容器:

auto vec = vector<int>3, 1;
sort(vec.begin(), vec.end(), less<int>()); // 1, 3
cout << vec.front(); // outputs 1

因为std::less按升序排序,所以调用vec.front()最终会返回最小值。

我对@9​​87654336@ 的默认行为和文档所说的内容的理解有些脱节。有人可以向我解释一下吗?

【问题讨论】:

【参考方案1】:

你使用了错误的算法,你可以阅读https://en.cppreference.com/w/cpp/container/priority_queue/priority_queue std::priority_queue 不使用 std::sort,而是使用 std::make_heap

如果你也在你的例子中使用它,你会得到你期望的输出。

std::vector<int> queue1, 3;
std::make_heap(queue.begin(), queue.end(), std::less<>);
std::cout << queue.front() << '\n';

Output: 3

【讨论】:

以上是关于解释默认 priority_queue::top() 的行为?的主要内容,如果未能解决你的问题,请参考以下文章

为 python 脚本设置默认解释器

如何设置默认的 PyCharm 解释器?

这个 wcf 服务正在运行……那是啥样的绑定?哪个是默认绑定?有人解释吗?

当 minoccurs=0 时如何解释 XSD 中原始类型的默认值

怎么设置anaconda为python默认解释器

如何在我的虚拟环境中使用 Python 3 (3.5) 作为默认解释器?