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

时间:2019-08-29 13:40:54

标签: c++

当我在类中定义自定义比较函数时,我会收到错误消息:

  

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

但是,如果我在类之外定义它,则可以使用。如何在课程的内部中定义它?

ListView.seperated

谢谢

4 个答案:

答案 0 :(得分:5)

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

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

当您实际需要一个仅将两个向量作为参数的函数时。将其声明为static或使用自由功能(首选方式)。

PS:除非您需要在不同的范围内调用相同的比较函数,否则我建议使用lambda:

sort(vec.rbegin(), vec.rend(),
        [](const vector<int> &i, const vector<int> &j) { 
                return  i.front()<j.front(); 
        }
     );

答案 1 :(得分:2)

有几种解决方法:

我希望提供lambda:

sort(vec.rbegin(), vec.rend(), [](const auto &a, const auto &b)
    {
        return std::lexicographical_compare(a.begin(), a.end(),
                                            b.begin(), b.end());
    });

其他方法是提供比较类:

class CmpIntVectors {
public:
    bool operator(const vector<int> &a, const vector<int> &b) const
    {
        return std::lexicographical_compare(a.begin(), a.end(),
                                            b.begin(), b.end());
    }

};

...

sort(vec.rbegin(), vec.rend(), CmpIntVectors{});

或将myfunction设为静态。

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

std::vector<std::vector<int>> vec;

答案 2 :(得分:1)

Lambdas是当今首选的方法,而不是定义自己的比较函数。它们更具可读性,并且可以就地显示(em),即您可以在调用sort()的地方看到代码,而不必在其他位置查看某些头文件。

答案 3 :(得分:0)

如果由于某种原因你仍然想使用类成员函数,那么使用 lambda 并将 this 传递给它:

sort(vec.rbegin(), vec.rend(), [this](const vector<int> &i, const vector<int> &j){
  return this->myfunction(i, j);
});