C++ 为什么更大<;int>;和更少<;int>;表现出相反的行为? 请考虑以下代码, using namespace std; std::priority_queue<int,vector<int>,std::greater<int>> queue; //first queue.push(26); queue.push(12); queue.push(22); queue.push(25); std::cout<<queue.top()<<endl; std::priority_queue<int,vector<int>,std::less<int>> queue2; //second queue2.push(26); queue2.push(12); queue2.push(22); queue2.push(25); std::cout<<queue2.top()<<endl; 使用名称空间std; std::优先级队列//第一 排队推送(26); 排队推送(12); 排队推送(22); 排队推送(25); 因为那是他们的工作less和greater应分别对运算符和code>进行建模,并由优先级队列使用以对其元素进行排序

C++ 为什么更大<;int>;和更少<;int>;表现出相反的行为? 请考虑以下代码, using namespace std; std::priority_queue<int,vector<int>,std::greater<int>> queue; //first queue.push(26); queue.push(12); queue.push(22); queue.push(25); std::cout<<queue.top()<<endl; std::priority_queue<int,vector<int>,std::less<int>> queue2; //second queue2.push(26); queue2.push(12); queue2.push(22); queue2.push(25); std::cout<<queue2.top()<<endl; 使用名称空间std; std::优先级队列//第一 排队推送(26); 排队推送(12); 排队推送(22); 排队推送(25); 因为那是他们的工作less和greater应分别对运算符和code>进行建模,并由优先级队列使用以对其元素进行排序,c++,stl,C++,Stl,它们产生相反的结果,因为它们被定义为这样做(除了相等的元素) 不应该创建最大堆吗 您将容器的内部表示与top()成员函数的接口误认为是容器的内部表示,根据比较器,该接口应该产生顶层元素。就内部算法本身而言,std::priority\u queue总是创建“max heap”。你只需要教它比较元素,让它知道什么是“max” 为了确定“max heap”的顺序,它使用了一个“less”风格的比较谓词:当给定一对(a,b)(按该特定顺序)时,谓词应该告诉a是否小于b。通过使用从谓词std::prio

它们产生相反的结果,因为它们被定义为这样做(除了相等的元素)

不应该创建最大堆吗


您将容器的内部表示与
top()
成员函数的接口误认为是容器的内部表示,根据比较器,该接口应该产生顶层元素。

就内部算法本身而言,
std::priority\u queue
总是创建“max heap”。你只需要教它比较元素,让它知道什么是“max”

为了确定“max heap”的顺序,它使用了一个“less”风格的比较谓词:当给定一对
(a,b)
(按该特定顺序)时,谓词应该告诉
a
是否小于
b
。通过使用从谓词
std::priority_queue
获得的排序信息,将确保较大的元素位于堆的顶部。标准
std::less
就是这样一个谓词的例子。无论您提供什么谓词,实现都会将其视为“less”样式的谓词

如果您提供了一个实现相反比较的谓词(如
std::greater
),那么很自然地会在顶部出现minimum元素。基本上,可以这样说:
std::priority_queue
需要一个“less”比较谓词,而通过提供一个“greater”比较谓词,实际上是在欺骗队列(以一种定义良好的方式)。这种欺骗的主要后果是,对于您(外部观察者)“最大堆”变成了“最小堆”

这正是您观察到的。

std::priority\u队列是一个“最大堆”。您提供的运算符小于;顶部的元素是最大的

在您的第二个示例中,您提供了小于作为直观的std::less;你可以在顶部看到最大的元素


在第一个例子中,你认为一个较大的int是“小于”一个较小的int;而基于“小于”的“最大”元素实际上是最小的int。

明确指出,如果使用
std::greater
,则最小的值位于顶部,可能是因为
greater
less
是相反的?缺乏研究是一个很好的选择