2012-09-17 40 views
2

我有std::set<std::pair<float,float>>它代表地图上的点(2d,x和y值),我有一个值x1和y1的点。如何按照距离点(x1,y1)的升序排列设置?如何按距离点(x1,y1)的升序对坐标进行排序?

+0

你知道如何计算距离吗? –

+0

编写您自己的谓词来检查您添加的集合点与给定点的距离更小或更大,并使用该比较方法创建集合,集合将自动对其元素进行排序。 – MarsRover

回答

6

std::set是一个有序的容器,并且在插入时发生排序,这取决于可以用第二个模板参数指定的排序标准。因此,使用带有谓词的set,该谓词根据到参考点的距离返回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

+0

您忘记将'DistanceCompare'的实例传递给pointSet的构造函数。如图所示,你的例子不会编译,因为'DistanceCompare'没有默认的构造函数。 – atzz

+0

@atzz谢谢,修正。 – juanchopanza

+0

@juanchopanza谢谢你的回答。我添加了像你说的代码,但是当我尝试插入pointSet时,出现错误C2228错误:'.insert'的左侧必须有class/struct/union。任何想法 ? – Damir

-1

两个点之间的距离可以被计算如下:

xd = x2-x1; 
yd = y2-y1; 
Distance = SquareRoot(xd*xd + yd*yd); 

Distance值可以用作排序参数。

相关问题