错误原因
问题在于这cmp是一个成员函数,您需要一个指向成员的指针才能调用它。
有三种方法
- 使用为该结构定义的operator()创建一个结构
struct compareFunc {
inline bool operator() (const vector<int> &a, const vector<int> &b)
{
return (a.back() < b.back());
}
};
并以以下方式调用sort函数:
std::sort(vect.begin(), vect.end(), compareFunc());
- 如果您使用的是C ++ 11版本,请编写lamda函数并调用类中定义的比较器函数:
std::sort(vec.begin(), vec.end(), [this](vector<int> a, vector<int> b){
return (compareFun(a,b));
});
- 使用静态方法__如下面的例子
例子 LeetCode1024_视频拼接
class Solution {
public:
// 问题在于这cmp是一个成员函数,您需要一个指向成员的指针才能调用它。
// error: reference to non-static member function must be called sort(clips.begin(), clips.end(), cmp);
// ^~~ 1 error generated.
// bool cmp(vector<int>& a, vector<int>& b) {
static bool cmp(vector<int>& a, vector<int>& b) {
vector<int>::iterator it_a = a.begin();
vector<int>::iterator it_b = b.begin();
if (*it_a == *it_b) {
// vector<int>::iterator it_b = a.begin() + 1;
// 这里 b.begin()写成了a,而且it_b++,不是b.begin()+1
it_a++;
it_b++;
return *it_a > *it_b;
}
// printf("*it_a is %d, *it_b is %d\n", *it_a, *it_b);
return *it_a < *it_b;
}
int videoStitching(vector<vector<int>>& clips, int T) {
int ans = 0;
sort(clips.begin(), clips.end(), cmp);
// st - T
int st = 0;
int nxt_st = -1;
int sz = clips.size();
for (int i = 0; i < sz; i++) {
if (clips[i][0] <= st) {
// 找到起始小于等于st中end最大的
if (clips[i][1] > nxt_st) nxt_st = clips[i][1];
continue;
}
// 2020年10月24日16:03:07 debug发现需要i--
i--;
if (nxt_st <= st) return -1;
ans++;
if (nxt_st >= T) return ans;
st = nxt_st;
}
// 最后还要有处理,VScode 调试不错
if (nxt_st <= st) return -1;
ans++;
if (nxt_st < T) return -1;
st = nxt_st;
return ans;
}
};
int main(){
vector<vector<int>> clips;
int x = 0,y = 2;
for (int i = 0; i < 3; i++) {
int a[] = {x, y};
x += 2;
y += 2;
vector<int> tmp(a,a+sizeof(a)/sizeof(int));
clips.push_back(tmp);
}
int a[] = {1, 3};
vector<int> tmp(a,a+sizeof(a)/sizeof(int));
clips.push_back(tmp);
Solution sol;
cout << sol.videoStitching(clips, 6) << endl;
return 0;
}