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