2012-09-17 59 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值可以用作排序參數。

相關問題