Как передать компаратор в качестве параметра для функции? - PullRequest
0 голосов
/ 09 марта 2019

У меня есть функция в заголовке сортировки для mergeSort

Это мой код:

template

void mergeSort(vector<Comparable> & a, vector<Comparable> & tmpArray, int left int right, Comparator cmp)
{
    if (cmp(left,right))
    {
        int center = (left + right) / 2;
        mergeSort(a, tmpArray, left, center);
        mergeSort(a, tmpArray, center + 1, right);
        merge(a, tmpArray, left, center + 1, right);
    }
}

Я хочу использовать этот компаратор и передать впараметры в моем mainDriver.cpp

class CompareXCoordinate {
public:
    bool operator()(const Point & p1, const Point & p2) const
    {
        return (p1.getX() < p2.getX());
    }
};

В настоящее время я передаю его так:

Точки - это вектор объектов Point. tempArr - пустой вектор

mergeSort(points, tempArr, points.begin(), points.end(), Point::CompareXCoordinate::operator())

Iполучить ошибку C3867: нестандартный синтаксис, использовать &, чтобы создать указатель на элемент

Это правильный способ передачи компаратора или другой синтаксис?

1 Ответ

1 голос
/ 09 марта 2019

operator() - это метод экземпляра, поэтому вам нужно передать экземпляр класса CompareXCoordinate в качестве компаратора, а не сам operator():

mergeSort(points, tempArr, points.begin(), points.end(), Point::CompareXCoordinate());

Хотя ваш класс не действует на какие-либо нестатические члены-данные (это имело бы смысл, если бы вы хотели использовать < или > для настройки), так что вы могли бы просто использовать автономную функцию вместо класс:

bool CompareXCoordinate(const Point & p1, const Point & p2)
{
    return (p1.getX() < p2.getX());
}

mergeSort(points, tempArr, points.begin(), points.end(), Point::CompareXCoordinate);

Или, если вы используете C ++ 11 или более позднюю версию, вы можете использовать вместо этого лямбду:

mergeSort(points, tempArr, points.begin(), points.end(),
    [](const Point & p1, const Point & p2){
        return (p1.getX() < p2.getX());
    }
);
...