【问题标题】:Why custom comparator functions are passed in Class or Struct?为什么自定义比较器函数在 Class 或 Struct 中传递?
【发布时间】:2020-05-17 01:08:56
【问题描述】:

我正在编写一个具有自己的比较器功能的优先级队列。在我看到以下实现的每个地方都无法弄清楚在类或结构中定义比较器函数的基本原理是什么?

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函数并使用它?

【问题讨论】:

  • 在 C++ 中,structclass 是相同的,只是具有不同的默认访问权限(结构是公共的,类是私有的)。
  • 更新了问题,谢谢

标签: c++ comparator


【解决方案1】:

为什么自定义比较器函数在 Class 或 Struct 中传递?

通常使用类而不是替代方法 - 函数指针 - 因为这样做可能更快。函数指针本质上是运行时多态的一种形式。优化器有时不可能,或者很难在调用时确定要调用什么函数。

相比之下,类的成员函数运算符重载在编译时是已知的,因为该类在编译时是已知的。至少,有一个优点是不必通过指针间接进行调用。在某些情况下,这甚至可能为内联扩展以及其他优化打开大门。

函数对象还具有能够跨其调用存储数据的优势,尽管并不总是需要利用这种可能性。


附:使用 lambda 生成函数对象类通常比显式编写更好。

【讨论】:

  • 这有帮助,所以可以使用普通函数而不是使其成为成员函数吗?你能在暗示或传达的地方提供参考吗?
  • @prashant 请参阅 C++ 标准的 [function.objects] 部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
相关资源
最近更新 更多