我正在编写一个具有自己的比较器功能的优先级队列。我看到的每个地方都遵循以下实现,但无法弄清楚在类或结构中定义比较器函数的原理是什么?
struct CompareHeight {
bool operator()(pair<int, int> const p1, pair<int, int> const p2)
{
if(p1.first == p2.first)
return p1.second > p2.second;
return p1.first < p2.first;
}
};
int main(){
priority_queue<pair<int, int >, vector<pair<int,int> >, CompareHeight> p;
}
编辑1-为什么使用类或结构像主函数一样直接定义比较器函数并使用它?
为什么自定义比较器函数在Class或Struct中传递?
通常使用类,而不是替代的-函数指针-因为这样做可能会更快。函数指针本质上是运行时多态的一种形式。有时,对于优化人员而言,在调用时确定将要调用的函数是不可能的,或者太困难了。
相比之下,类的成员函数运算符重载在编译时是已知的,因为该类在编译时是已知的。至少,优点是不必通过指针间接进行调用。在某些情况下,这甚至可能为在线扩展以及其他优化打开大门。
功能对象还具有能够在其调用之间存储数据的优点,尽管并不总是需要利用这种可能性。
P.S。通常最好使用lambda生成函数对象类,而不是显式地编写它。