我有一个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负责排序的顺序。