C++ 如何在类中声明自定义比较函数?

C++ 如何在类中声明自定义比较函数?,c++,C++,当我在类中定义自定义比较函数时,我将得到以下错误: “Solution::myfunction”:非标准语法;使用“&”创建指向成员的指针 但是,如果我在类之外定义它,它就会工作。我如何在类中定义它 class Solution { public: bool myfunction(const vector<int> &i, const vector<int> &j) { return i.front() < j.fr

当我在类中定义自定义比较函数时,我将得到以下错误:

“Solution::myfunction”:非标准语法;使用“&”创建指向成员的指针

但是,如果我在类之外定义它,它就会工作。我如何在类中定义它

class Solution {
    public:
    bool myfunction(const vector<int> &i, const vector<int> &j) { 
        return i.front() < j.front()); 
    }
    vector<vector<int>> vec;
    ...
    sort(vec.rbegin(), vec.rend(), myfunction);
}
类解决方案{
公众:
bool-myfunction(const-vector&i,const-vector&j){
返回i.front()

感谢

非静态成员函数将隐式
this
作为第一个参数。调用成员函数的正确方法是

Solution s;
std::vector<int> x;
s.myfunction(x,x);

非静态成员函数将隐式
this
作为第一个参数。调用成员函数的正确方法是

Solution s;
std::vector<int> x;
s.myfunction(x,x);

有两种方法可以解决此问题:

我更喜欢提供lambda:

排序(vec.rbegin(),vec.rend(),[](常数自动&a,常数自动&b)
{
return std::lexicographical_compare(a.begin(),a.end(),
b、 begin(),b.end());
});
另一种方法是提供comparetion类:

类CMPIntVector{
公众:
布尔运算符(常数向量&a、常数向量&b)常数
{
return std::lexicographical_compare(a.begin(),a.end(),
b、 begin(),b.end());
}
};
...
排序(vec.rbegin(),vec.rend(),CmpIntVectors{});
或者使
myfunction
static

免责声明:我假设您的
vec
如下所示:

std::向量向量向量机;

有两种方法可以修复它:

我更喜欢提供lambda:

排序(vec.rbegin(),vec.rend(),[](常数自动&a,常数自动&b)
{
return std::lexicographical_compare(a.begin(),a.end(),
b、 begin(),b.end());
});
另一种方法是提供comparetion类:

类CMPIntVector{
公众:
布尔运算符(常数向量&a、常数向量&b)常数
{
return std::lexicographical_compare(a.begin(),a.end(),
b、 begin(),b.end());
}
};
...
排序(vec.rbegin(),vec.rend(),CmpIntVectors{});
或者使
myfunction
static

免责声明:我假设您的
vec
如下所示:

std::向量向量向量机;

如今,lambda是首选的方法,而不是定义自己的比较函数。它们更具可读性和就地性,也就是说,您可以在调用sort()的地方看到代码,而不是在其他地方的头文件中查看。

lambda是目前首选的方法,而不是定义自己的比较函数。它们更具可读性和就地性,也就是说,您可以在调用sort()的地方看到代码,而不是在其他地方的某些头文件中查看。

如果出于某种原因,您仍然希望使用类成员函数,那么请使用lambda并将此
传递给它:

sort(vec.rbegin(), vec.rend(), [this](const vector<int> &i, const vector<int> &j){
  return this->myfunction(i, j);
});
排序(vec.rbegin(),vec.rend(),[this](常量向量&i,常量向量&j){ 返回此->myfunction(i,j); });
如果出于某种原因,您仍然希望使用类成员函数,则使用lambda并将此
传递给它:

sort(vec.rbegin(), vec.rend(), [this](const vector<int> &i, const vector<int> &j){
  return this->myfunction(i, j);
});
排序(vec.rbegin(),vec.rend(),[this](常量向量&i,常量向量&j){ 返回此->myfunction(i,j); });
它必须是
静态的
才能像那样工作。非成员函数会像
静态的
成员函数一样衰减为指向自身的指针。非静态成员函数不会自动衰减为指针,您必须显式使用运算符
&
的地址来获取指针(正如错误消息告诉您的那样)。缺少
vec
的声明可能会隐藏代码的另一个问题。我假设:
std::vector-vec。它需要是
静态的
才能像那样工作。非成员函数会衰减为指向自身的指针,就像
静态的
成员函数一样。非静态成员函数不会自动衰减为指针,您必须显式使用运算符
&
的地址来获取指针(正如错误消息告诉您的那样)。缺少
vec
的声明可能会隐藏代码的另一个问题。我假设:
std::vector-vec
@GuillaumeRacicot也是我的首选,出于某种原因,我认为OP需要在不同的地方进行比较,将编辑答案您使用
rbegin
rend
而不是
begin
end
有什么特殊原因吗?@skpro19没有。可能我在写答案时甚至没有注意到,只是使用了OP使用的东西,没有做任何必要的更改好的。此外,如果正在排序的容器的大小小于2,上述技巧是否有效?@skpro19什么“技巧”?实际上,我永远不会对
std::sort
使用
rbegin
rend
。是的,
std::sort
适用于任何大小的container@GuillaumeRacicot这也是我的第一选择,出于某种原因,我认为OP需要在不同的地方进行比较,将编辑答案您使用
rbegin
rend
而不是
begin
end
有什么特殊原因吗?@skpro19没有。可能我在写答案时甚至没有注意到,只是使用了OP使用的东西,没有做任何必要的更改好的。此外,如果正在排序的容器的大小小于2,上述技巧是否有效?@skpro19什么“技巧”?实际上,我永远不会对
std::sort
使用
rbegin
rend
。是的
std::sort
适用于任何大小的容器