Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 依赖于外部值的自定义比较器_C++_C++11_Set - Fatal编程技术网

C++ 依赖于外部值的自定义比较器

C++ 依赖于外部值的自定义比较器,c++,c++11,set,C++,C++11,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;

我想要一组点,按到第三个点的距离排序。这样可能吗

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

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;
}
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);
}
struct compStruct{
点-点;

bool操作符()(常量点&a,常量点&b)常量{返回长度(a点)Use
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);
}
#包括
使用Cmp=std::函数;
void g(std::set){}
空f(常数点和常数点)
{

auto pointComp=[&](const Point&a,const Point&b){返回长度(a-Point)如果更改声明
std::set
实例的方式,则第一个示例应该可以运行:

std::set<Point, compStruct> pointSet(cs);
std::set pointSet(cs);
该模板不限制您使用函数类型;您可以指定一个类用作比较器


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

我从未想到在创建集合时会使用不同的函数。@Gartenries您可以自由自定义容器中使用的比较器,但容器需要一个指示比较器类型的模板类型参数,您试图传递比较器本身(不是它的类型)作为模板类型参数,这是不可能的。std::function是一种类型擦除,可以包装lambda表达式以及其他可调用的functor谢谢解释!我想这两个答案都是正确的,但我接受了另一个,因为他/她更需要声誉;)我希望没问题!你是正确的;你需要通过已将点设置为集合构造函数的比较器实例。