为什么 std::p riority_queue
首先返回最大的元素(即是最大优先级队列),即使它使用 std::less
作为比较类型?
当我想创建一个最小队列时,这尤其让我感到困惑,这将由std::p riority_queue完成。
优先级队列的作用与
是您的最大值。如果您使用sor()
相反,使事情不太一致。如果您使用更大的
比较器对向量进行排序()
,那么向量的前面()更大的
创建优先级队列,那么前面是最小的值。我意识到优先级队列使用堆,但我觉得这是有充分理由的。
因为当使用堆的方法时,编码是非常自然的。
检查一个(简化的)可能的实现:
template <class T, class Container = std::vector<T>, class Compare = std::less<T> >
class priority_queue {
public:
explicit priority_queue(const Container& c_ = Container(),
const Compare& comp_ = Compare())
: c(c_), comp(comp_)
{
std::make_heap(c.begin(), c.end(), comp);
}
void push(const T& x)
{
c.push_back(x);
std::push_heap(c.begin(), c.end(), comp);
}
void pop()
{
std::pop_heap(c.begin(), c.end(), comp);
c.pop_back();
}
};
我理解你说的话,但正如胡安科潘扎所说:“如果情况正好相反,那可能会让其他人感到困惑。”。
这样做是为了与历史实现保持一致:自标准模板库(后来成为C标准库)诞生以来,许多类(如<code>std::map</code>)和算法(如<code>std:sort</code>)在其排序功能中使用的比关系少。
在多个类和模板之间保持一致很重要,因为库用户不需要记住哪个比较是哪个容器或算法的默认比较。
我一直想知道为什么STL优先级队列默认使用最大堆而不是最小堆。我想到的两个明显的用例是寻路(Dijkstra)和构建霍夫曼代码。这两种算法都需要首先拉取最小元素。由于排序(std::sort)默认使用升序,我想知道priority_queue背后的设计原因是什么,因为我非常喜欢默认的最小堆。
我知道了从< code>std::async返回的< code>future具有某种特殊共享状态的原因,通过这种状态,< code >等待返回的future发生在future的析构函数中。但是当我们使用< code>std::pakaged_task时,它的未来不会表现出同样的行为。要完成打包的任务,必须从< code>packaged_task显式调用< code>future对象上的< cod
我想知道为什么使用创建min堆时,应该使用? 对我来说,因为最小的值总是位于堆的顶部,所以使用的类应该是 更新:另一方面,由于(max heap)的默认行为是在顶部保留最大值,因此在我看来,应该用于最大堆创建,而不是最小堆创建
https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?
我正在阅读priority_queue(基本上是make_heap的包装器)的文档,它发现可以用比较函数定制它。 来自文档(http://en . CP preference . com/w/CPP/container/priority _ queue): 可以提供用户提供的Compare来更改排序,例如使用std::更大会导致最小的元素显示为top()。 在维基百科和其他CS文本中,堆被定义为这
在过去的几个月里,我一直在学习C语言并使用终端。我的代码使用g和c11编译并运行得很好,但在过去几天里它开始出现错误,此后我在编译时遇到了问题。我唯一可以编译和运行的程序依赖于旧的C标准。 我第一次遇到的错误包括 尝试使用ecg$g-o stoi_试验stoi_试验编译。cpp-std=c 11 大堆cpp:13:22:错误:命名空间“std”中没有名为“stoi”的成员;你是说“阿托伊”吗?in