如何通过比较器作为函数的参数?

时间:2019-03-09 01:15:39

标签: c++ mergesort cartesian-coordinates

我在mergeSort的排序标题中有一个函数

这是我的代码:

模板

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

目前,我正在像这样传递它:

Points是Point对象的向量 tempArr是一个空向量

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

我收到C3867的错误:非标准语法,使用&创建指向成员的指针

这是传递比较器的正确方法还是另外一种语法?

1 个答案:

答案 0 :(得分:1)

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或更高版本,则可以改用lambda:

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