我有一个EnemyRhombus课。它是一个单位,可以移动到地图上的不同点。

我想处理点可以移动到的点,以增加与它们的距离。

为此,我想对点进行排序。

代码1:

class EnemyRhombus
{
public:
    int x,y;
    int dist(Point p)
    {
        int dx=abs(p.x-x);
        int dy=abs(p.y-y);
        return dx+dy-min(dx,dy);
    }
    bool points_cmp(Point f, Point s)
    {
        return dist(f)<dist(s);
    }
    void move()
    {
        vector<Point> candidates;
        //...
        sort(candidates.begin(),candidates.end(),points_cmp);
    }
}


无法编译。版画

[错误]没有匹配的函数可调用'sort(std :: vector :: iterator,std :: vector :: iterator,)'

代码2:

class EnemyRhombus
{
public:
    int x,y;
    static int dist(Point p, int tx, int ty)
    {
        int dx=abs(p.x-tx);
        int dy=abs(p.y-ty);
        return dx+dy-min(dx,dy);
    }
    template<int X, int Y> static bool points_cmp(Point f, Point s)
    {
        return dist(f,X,Y)<dist(s,X,Y);
    }
    void move()
    {
        vector<Point> candidates;
        //...
        sort(candidates.begin(),candidates.end(),points_cmp<x,y>);
    }
}


产生错误:

[错误]'EnemyRhombus :: x'无法出现在常量表达式中

[错误]'EnemyRhombus :: y'无法出现在常量表达式中



我该如何解决这个问题?



使用答案中的示例可能会产生错误和警告,说默认情况下启用了c ++ 11,这是不正确的(至少在orwell dev-cpp中)。
为了使它们起作用,应该在编译器命令中添加-std=c++11
(在我的情况下,工具->编译器选项->一般)

最佳答案

除了使用静态/类外函数之外,还可以使用C ++ 11 lambda,也可以使用P0W建议的方法。

std::sort(candidates.begin(),candidates.end(),
    [&](Point f, Point s) { return dist(f) < dist(s); }
);


Lambda负责排序的顺序。

10-08 05:59