Как я могу отсортировать массив с помощью пользовательского компаратора?

Когда я звоню 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 ++.

1

Решение

Ваша функция сравнения A::cmp является нестатическим членом A, Таким образом, он принимает три аргумента: в дополнение к двум явно объявленным аргументам, он также принимает указатель на 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));
3

Другие решения

Ответ @ DietmarKühl прекрасно объясняет, почему ваш код не компилируется.
Но с тех пор C ++ 11, Вы также можете использовать лямбда-выражение вместо того, чтобы определять функцию сравнения или делать ее статической:

#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());
});
}
};

Я приказываю иметь доступ к члену класса text в лямбда-выражении я захватил this указатель.
Тем не менее, если вы хотите альтернативу захвата thisпожалуйста, посмотрите на этот ответ.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector