为什么在 Class 或 Struct 中传递自定义比较器函数?
Why custom comparator functions are passed in Class or Struct?
我正在编写一个具有自己的比较器函数的优先级队列。我看到以下实现的每个地方都无法弄清楚在 class 或 struct?
中定义比较函数的基本原理是什么
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 直接像 main 函数一样定义比较器函数并使用它?
Why custom comparator functions are passed in Class or Struct?
类 经常被使用而不是替代 - 函数指针 - 因为这样做可能更快。函数指针本质上是运行时多态性的一种形式。有时不可能,或者对于优化器来说太难在调用时确定要调用什么函数。
相比之下,class 的成员函数运算符重载在编译时是已知的,因为 class 在编译时是已知的。至少,有一个优点是不必通过指针间接进行调用。在某些情况下,这甚至可能打开内联扩展的大门,并通过它进行其他优化。
函数对象还具有能够跨调用存储数据的优势,尽管并不总是需要利用这种可能性。
P.S。通常最好使用 lambda 生成函数对象 class 而不是显式编写它。
我正在编写一个具有自己的比较器函数的优先级队列。我看到以下实现的每个地方都无法弄清楚在 class 或 struct?
中定义比较函数的基本原理是什么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 直接像 main 函数一样定义比较器函数并使用它?
Why custom comparator functions are passed in Class or Struct?
类 经常被使用而不是替代 - 函数指针 - 因为这样做可能更快。函数指针本质上是运行时多态性的一种形式。有时不可能,或者对于优化器来说太难在调用时确定要调用什么函数。
相比之下,class 的成员函数运算符重载在编译时是已知的,因为 class 在编译时是已知的。至少,有一个优点是不必通过指针间接进行调用。在某些情况下,这甚至可能打开内联扩展的大门,并通过它进行其他优化。
函数对象还具有能够跨调用存储数据的优势,尽管并不总是需要利用这种可能性。
P.S。通常最好使用 lambda 生成函数对象 class 而不是显式编写它。