Stl <;优先级队列>;为什么要对值进行两次比较?

Stl <;优先级队列>;为什么要对值进行两次比较?,stl,queue,priority-queue,predicate,Stl,Queue,Priority Queue,Predicate,为什么在按下s2和s4时会对值进行两次比较 运行调试版本,有可能吗?许多库实现在调试构建中执行无关的比较,以验证比较谓词是否实际有效。不满足需求的谓词是bug的常见来源。看起来Igor的评论是正确的。您显示的数据表明,每当进行交换时,代码都会进行额外的比较。所以在第一种情况下,它必须交换5和3。交换后,将使用反转的参数重新进行比较。对于这种虚假的比较,我能想到的唯一原因是验证比较函数是否返回了正确的值。运行一个非调试版本,看看虚假的比较是否消失。 struct St { int e;

为什么在按下s2和s4时会对值进行两次比较

运行调试版本,有可能吗?许多库实现在调试构建中执行无关的比较,以验证比较谓词是否实际有效。不满足需求的谓词是bug的常见来源。看起来Igor的评论是正确的。您显示的数据表明,每当进行交换时,代码都会进行额外的比较。所以在第一种情况下,它必须交换5和3。交换后,将使用反转的参数重新进行比较。对于这种虚假的比较,我能想到的唯一原因是验证比较函数是否返回了正确的值。运行一个非调试版本,看看虚假的比较是否消失。
struct St {
    int e;
    bool operator < (const St &s) const {
        cout << "e" << e << endl;
        cout << "s" << s.e << endl;
        return e > s.e;
    }
};
int main() {
        priority_queue<St> q;
        St s1, s2, s3, s4;
        s1.e = 5;
        s2.e = 3;
        s3.e = 7;
        s4.e = 2;
        q.push(s1);
        cout << "ssssss1" << endl;
        q.push(s2);
        cout << "ssssss2" << endl;
        q.push(s3);
        cout << "ssssss3" << endl;
        q.push(s4);
        cout << "ssssss4" << endl;
        cout << q.top().e;
        return 0;
    }
ssssss1
e5
s3
e3
s5
ssssss2
e3
s7
ssssss3
e5
s2
e2
s5
e3
s2
e2
s3
ssssss4
2