自定义比较器,取决于外部值

时间:2014-12-08 18:54:35

标签: c++ c++11 set

我希望得到set点数,按距离排序到第三点。有可能吗?

我试过了,但这不起作用:

struct compStruct {

    Point point;

    bool operator()(const Point & a, const Point & b) const { return length(a-point)<length(b-point); }

};

void f(const Point & point) {
    compStruct cs;
    cs.point = point;
    std::set<Point, &cs.operator()> pointSet;
}

我不能使用lambda,因为我想将该set用作另一个函数的参数。所以这不起作用:

void g(std::set<Point, pointComp>) {}
void f(const Point & point) {
    auto pointComp = [&](const Point & a, const Point & b){ return length(a-point)<length(b-point); };
    std::set<Point, pointComp> s;
    g(s);
}

2 个答案:

答案 0 :(得分:2)

如果您更改声明std::set实例的方式,那么您的第一个示例应该有效:

std::set<Point, compStruct> pointSet(cs);

模板不限制您使用函数类型;您可以指定一个用作比较器的类。

编辑 - 更新示例以正确传递比较器的实例。

答案 1 :(得分:1)

使用std::function

#include <functional>

using Cmp = std::function<bool(const Point & a, const Point & b)>;

void g(std::set<Point, Cmp>) {}

void f(const Point & point)
{
    auto pointComp = [&](const Point & a, const Point & b){ return length(a-point)<length(b-point); };
    std::set<Point, Cmp> s(pointComp);
    g(s);
}