C++ std::priority\u队列的自定义比较器后面的逻辑

C++ std::priority\u队列的自定义比较器后面的逻辑,c++,stl,C++,Stl,我正在尝试为以下优先级队列编写自定义比较器: priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> pq; 我不太明白为什么这样做是正确的。 为什么比较器返回a.secondb.second,因为我想将计数最多的一对放在顶部? 优先级队列将如何实际使用此比较器?来自的文档: 请注意,Compare参数的定义是,如果其第一个参数在弱顺序中位于第二个参数之前,则返回true。但是,由于优先级队

我正在尝试为以下优先级队列编写自定义比较器:

priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> pq;
我不太明白为什么这样做是正确的。 为什么比较器返回
a.second
而不是
a.second>b.second
,因为我想将计数最多的一对放在顶部? 优先级队列将如何实际使用此比较器?

来自的文档:

请注意,
Compare
参数的定义是,如果其第一个参数在弱顺序中位于第二个参数之前,则返回
true
。但是,由于优先级队列首先输出最大的元素,“在前面”的元素实际上是最后输出的


同样的情况也发生在:提供一个返回
a
的比较器–它的作用–导致此函数模板构建一个最大堆,即具有最高键的元素位于堆的顶部。如果要构建最小堆,则必须传递
运算符>
,而不是
运算符以确保一致性。所有的集装箱分拣功能原型预计都会“少于”比较。然而,优先级队列返回“最大”的东西作为顶部。换句话说,优先级队列是“从后面读取”。比较器的目的是确定两个参数之间的“较少”状态。这就是它的全部功能。别再想它了“这决定了队列中
a
是否在
b
之前”。例如,如果
cmp{}(a,b)
回答为真,则表示
a
b
小,但也表示明显的对应:
b
a
大,因此,根据优先级队列适配器的内部结构,它将更接近队列的顶部。你们写一个答案而不是在注释中回答怎么样?顺便说一句,我想指出,比较器应该引用常量。@ypnos,引用一对
int
s有什么意义?它很可能在单个寄存器中传递,当您按值获取它时,可以避免比较器中的间接寻址。@Evg const&为编译器提供了最大范围的优化选项。在可能的情况下,它仍可能在寄存器中传递该对。当寄存器不可用时,它可能会传递指针。在大多数平台上,间接寻址是免费的。但最重要的一点是,函数的签名表达了它的意图,为编译器提供了充分的权力,而程序员犯错误的权力更少(例如,对结构成员执行
=
'比较',而不是
=
)。
class cmp{
public:
   bool operator()(const pair<int,int> a, const pair<int,int> b)const{
        return a.second < b.second;
    }

};