今天刷56题时,自定义一个c++比较函数,结果报错:
代码:
class Solution {
public:
bool cmp(vector<int> a, vector<int> b)
{
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals)
{
sort(intervals.begin(), intervals.end(), cmp);
int n = intervals.size();
int min, max;
vector<vector<int>> ans;
vector<int> temp(2);
for(int i=0; i<n; ++i)
{
min = intervals[i][0];
max = intervals[i][1];
while(i + 1 < n && intervals[i+1][0] <= max)
{
i++;
if(intervals[i][1] > max)
{
max = intervals[i][1];
}
}
temp[0] = min;
temp[1] = max;
ans.push_back(temp);
}
return ans;
}
};
分析:
显示说:必须调用对非静态成员函数的引用.
sort函数的定义如下:
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp)
comp:二进制函数,接受范围内的两个元素作为参数,并返回一个可转换为bool的值。返回的值指示作为第一个参数传递的元素在其定义的特定严格弱顺序中是否被视为先于第二个参数。函数不应修改其任何参数。这可以是函数指针或函数对象。
原因:
可见,sort中自定义的比较函数的参数为两个元素,而我们在class类中定义的比较函数为成员函数,实际多了一个隐藏的参数,即为:
bool cmp(Solution* this, vector<int> a, vector<int> b)
所以就会报错.
解决办法:
核心思想:修改定义方式,去掉this指针.
有两种方式:
1.将cmp函数定义在class之外,就不会有this指针
2.将cmp定义为静态成员函数,也不会有this指针,即:
static bool cmp(vector<int> a, vector<int> b)
{
return a[0] < b[0];
}