baodream的笔记
目录
1.关于类中重载sort函数的报错问题
在类外重载sort函数的cmp直接定义即可,如下图:
typedef struct num{
int num;
int id;
}NUM;
bool cmp(NUM a,NUM b){
return a.num<b.num;
}
class Solution {
public:
void fun(){
vector<NUM>v;
sort(v.begin(),v.end(),cmp);
}
};
int main(){
Solution s;
s.fun();
return 0;
}
但是如果在类里面直接这样重载cmp函数会出现如下错误:
类中重载sort函数的报错问题(error: invalid use of non-static member function ‘bool Solution::cmp(int, int)’)
所以必须如下定义,加上static关键字:
class Solution {
public:
typedef struct num{
int num;
int id;
}NUM;
static bool cmp(NUM a,NUM b){
return a.num<b.num;
}
void fun(){
vector<NUM>v;
sort(v.begin(),v.end(),cmp);
}
};
int main(){
Solution s;
s.fun();
return 0;
}
在class类中的sort函数的参数cmp,定义时要声明为static,那么背后的原因是什么呢?
这是跟sort函数的定义有关系的,下面是sort函数的源码官方文档
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
可以知道其实我们写参数cmp时,是把函数名作为实参传递给了sort函数,而sort函数内部是用一个函数指针去调用这个cmp函数的(建议先看下 一文搞懂什么是 函数指针 ),我们知道class普通类成员函数cmp需要通过对象名.cmp()来调用,而sort()函数早就定义好了,那个时候哪知道你定义的是什么对象,所以内部是直接cmp()的,那你不加static时,去让sort()直接用cmp()当然会报错
static静态成员函数不用加对象名,就能直接访问函数(这也是静态成员函数的一大优点)所以加了static就不会报错