为什么std :: sort()需要静态比较功能?

时间:2014-09-30 22:20:30

标签: c++ std

我正在解决Leetcode OJ中的一个问题。我写了一个这样的解决方案:

/**
 * 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>)'

然后我用comparefunc更改了static签名(在其他解决方案中看到),如:

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

它有效!我的问题是 - 为什么需要static

2 个答案:

答案 0 :(得分:9)

想想你如何在课堂外调用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)
}

答案 1 :(得分:2)

没有static&Solution::comparefunc的类型是:

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

static&Solution::comparefunc的类型为:

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