我正在解决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
?
答案 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);