我有std::set<std::pair<float,float>>
它代表地图上的点(2d,x 和 y 值),我有一个点,其值为 x1 和 y1。如何按距点(x1,y1)的距离按升序对集合进行排序?
问问题
2045 次
2 回答
6
std::set是一个有序容器,并且在插入时发生排序,这取决于可以使用第二个模板参数指定的排序标准。因此,将 aset
与根据到参考点的距离返回 true 或 false 的谓词一起使用。
struct DistanceCompare
{
DistanceCompare(const std::pair<float,float>& point) : point_(point) {}
bool operator()(const std::pair<float,float>& lhs,
const std::pair<float,float>& rhs) const
{
return distance2(lhs) < distance2(rhs);
};
private:
float distance2(const std::pair<float,float>& point) const
{
// calculate distance squared between point and point_
const float x = point.first - point_.first;
const float y = point.second - point_.second;
return x*x + y*y;
}
std::pair<float, float> point_;
};
....
std::pair<float,float> refPoint = ....;
DistanceCompare comp(refPoint);
std::set<std::pair<float, float>, DistanceCompare> pointSet(comp);
比较距离的平方就足够了,从而避免调用std::sqrt
.
于 2012-09-17T09:10:08.220 回答
-1
两点之间的距离可以计算如下:
xd = x2-x1;
yd = y2-y1;
Distance = SquareRoot(xd*xd + yd*yd);
的值Distance
可以作为排序参数。
于 2012-09-17T09:13:03.623 回答