如何使用自定义比较器对数组进行排序?

时间:2013-12-07 23:25:58

标签: c++ sorting vector stl comparator

当我从下面的代码中调用build函数时,出现以下编译错误:

error C3867: 'SuffixArray::cmp': function call missing argument list; use '&SuffixArray::cmp' to create a pointer to member
error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided

这是我的代码:

class A{
private:
    std::string text;
    std::vector<int> array;

    bool cmp(int a, int b) {
        return std::lexicographical_compare(text.begin() + a, text.end(),
                                            text.begin() + b, text.end());
    }

    void build(const std::string &str, std::vector<int> &vec) {

        // Some vector values actions.

        std::sort(vec.begin(), vec.end(), cmp);
    }
};

这里有什么问题?我正在使用Visual C ++编译器。

2 个答案:

答案 0 :(得分:3)

您的比较函数A::cmpA的非静态成员。因此,它需要三个参数:除了显式声明的两个参数之外,它还使用指向A的指针成为隐式可用的this。它还有一个与普通函数指针不同的类型:bool (A::)(int, int)在通过值传递时衰减为bool (A::*)(int, int)

然而,您可以std::bind()将您的函数用于合适的对象:

std::sort(vec.begin(), vec.end(),
          std::bind(&A::cmp, this, std::placeholders::_1, std::placeholders::_2));

答案 1 :(得分:0)

@DietmarKühl的回答很好地说明了为什么您的代码无法编译。 但是自C++11起,您也可以使用lambda expression来代替定义比较函数或使其固定为静态:

#include <vector>
#include <algorithm>

class A{
private:
    std::string text;
    std::vector<int> array;

    void build(const std::string &str, std::vector<int> &vec) {

        // Some vector values actions.

        std::sort(vec.begin(), vec.end(), [this](int a, int b) {
            return std::lexicographical_compare(text.begin() + a, text.end(),
                                                text.begin() + b, text.end());
        });
    }
};

为了能够访问lambda表达式中的类成员text,我捕获了this指针。 但是,如果您想要捕获this的替代方法,请查看this answer