2014-09-30 54 views
4

我正在解决Leetcode OJ中的一个问题。我写了这样一个解决方案:为什么std :: sort()需要静态比较函数?

/** 
* Definition for an interval. 
* struct Interval { 
*  int start; 
*  int end; 
*  Interval() : start(0), end(0) {} 
*  Interval(int s, int e) : start(s), end(e) {} 
* }; 
*/ 
class Solution { 
public: 
    bool comparefunc (const Interval& a, const Interval& b) { 
     return a.start < b.start; 
    } 
    vector<Interval> merge(vector<Interval> &intervals) { 
     vector<Interval> result; 
     if(intervals.empty()) return result; 

     // sort Interval vector on increasing order of start 
     sort (intervals.begin(), intervals.end(), comparefunc); 

     // some other stuffs 
     result.push_back(intervals[0]); 
     for(int i = 1; i < intervals.size(); ++i) { 
      if(intervals[i].start > result.back().end) result.push_back(intervals[i]); 
      else result.back().end = max(result.back().end, intervals[i].end); 
     } 
     return result; 
    } 
}; 

而这会产生编译错误:

no matching function for call to 
'sort(std::vector<Interval>::iterator, std::vector<Interval>::iterator, <unresolved overloaded function type>)' 

然后我(在其他的解决方案锯)与static改变comparefunc签名一样:

static bool comparefunc (const Interval& a, const Interval& b) { 
    return a.start < b.start; 
} 

它的工作!我的问题是 - 为什么它需要是static

+4

由于非静态成员函数具有用于'this'一个隐含的第一参数。这是他们如何访问其他成员。 – juanchopanza 2014-09-30 22:21:23

+0

@ juanchopanza更多解释请!请发表回答 – 2014-09-30 22:25:14

+0

由于与Solution的成员函数外部相同的原因,您不能在不指定“Solution”实例的情况下调用非静态函数comparefunc。也就是说,'Solution :: comparefunc(a,b)'在语法上不是有效的。 '&Solution :: comparefunc'是一个“指向成员函数的指针”(例如,参见http://www.parashift.com/c++-faq/pointers-to-members.html)。 – rici 2014-09-30 22:32:18

回答

8

想想你是如何在班级以外致电compareFunc的。你总是会碰到这样的

a.compareFunc(b, c) 
^   ^^ 

这3个参数,而不是2

sort的代码是你的类之外,将不得不使用上述语法。

使构件静态允许此呼叫:

Solution::compareFunc(a, b) 

这是只有2个参数和std::sort期望相匹配的谓词。

这就是为什么(例如)当重载operator<因为它接受一个参数的成员函数,而如果你重载它作为一个非成员,它需要两个:

struct Foo 
{ 
    bool operator<(Foo const& other) { /* ... */ } 
}; 

int main() 
{ 
    Foo a, b; 
    a < b; // calls a.operator<(b) 
} 

struct Foo 
{}; 

bool operator<(Foo const& lhs, foo const& rhs) { /* ... */ } 

int main() 
{ 
    Foo a, b; 
    a < b; // calls operator<(a, b) 
} 
2

而不static&Solution::comparefunc的类型是:

bool (Solution::*) (const Interval& a, const Interval& b); 

static&Solution::comparefunc的类型是:

bool (*) (const Interval& a, const Interval& b); 
相关问题