对类成员进行排序得到错误未解析的重载函数类型

时间:2015-02-28 12:30:07

标签: c++ sorting

class S {
    public:
        vector <int> ia;
        int rank;
        bool cmp(S const &s1, S const &s2) {
            return (s1.rank > s2.rank);
        }
        void sort_on_rank() {
            sort(ia.begin(), ia.end(), cmp);
        }
};

这段代码试图在排名上对矢量进行排序,但由于跟随错误而无法编译,
[错误]没有匹配函数调用'sort(std :: vector :: iterator,std :: vector :: iterator,)'

请帮我解释一下这个问题。

2 个答案:

答案 0 :(得分:4)

从您的程序中,您似乎想要对S类的对象进行排序。在这种情况下,你的矢量应该是这样的:std::vector<S>

您的cmp是类S的非静态成员函数,因此std::sort无法使用它。 (想想你将如何使用该功能)。

您可以为您的类重载<运算符,也可以传递独立/静态成员函数,也可以使用C ++ 11 lambda表达式。

因此你的班级成为:

class S {
    public:
        vector<S> ia;
        int rank;
        void sort_on_rank() {
            sort(ia.begin(), ia.end(), 
                 [] (S const &s1, S const &s2) {
                     return (s1.rank > s2.rank);
                 });
        }
};

但是,如果您只想按降序对包含int的向量进行排序,只需使用返回std::sort的C ++ 11 lambda调用lhs > rhs

std::sort(ia.begin(), ia.end(), [](int x, int y) { return x > y; });

答案 1 :(得分:1)

您的S::cmp()需要S,但S::ia的值类型为int