2010-04-16 55 views
1

我有一個Point對象的列表(每個對象都有x,y屬性),並且希望找到最左邊和最右邊的點。我一直試圖用find_if來做,但我不確定它要走的路,因爲我似乎無法通過比較器實例。 find_if要走的路嗎?似乎沒有。那麼,<algorithm>中是否有算法來實現這一點?查找列表的最左邊和最右邊的點。 std :: find_if正確的方式去?

在此先感謝。

#include <iostream> 
#include <list> 
#include <algorithm> 

using namespace std; 

typedef struct Point{ 
     float x; 
     float y; 
} Point; 

bool left(Point& p1,Point& p2) 
{ 
     return p1.x < p2.x; 

} 
int main(){ 
     Point p1 ={-1,0}; 
     Point p2 ={1,0}; 
     Point p3 ={5,0}; 
     Point p4 ={7,0}; 

     list <Point> points; 

     points.push_back(p1); 
     points.push_back(p2); 
     points.push_back(p3); 
     points.push_back(p4); 

     //Should return an interator to p1. 
     find_if(points.begin(),points.end(),left);             

     return 0; 
} 

回答

3

改爲使用std::min_elementstd::max_element

list<Point>::iterator left = std::min_element(points.begin(), points.end(), left); 
list<Point>::iterator right = std::max_element(points.begin(), points.end(), left); 

我也會改變的left到簽名:

bool left(const Point& p1, const Point& p2) 
+0

感謝。必須創建一個struct left {bool operator(){...}};使其工作 – Tom 2010-04-16 08:46:04

+0

@Tom問題似乎是,名稱'left'與某些東西衝突,如果我將函數名稱更改爲'foo',我不需要函子,但可以直接傳遞函數。 – 2010-04-16 08:59:57

+0

+1如果性能是一個問題,您可以編寫自己的算法,在列表中單次傳遞並返回一對最小/最大值。 – 2010-04-16 15:14:57

0

如果使用pair<float, float>,而不是你自己的Point的,沒有必要爲一個特殊的比較。在y軸上也會有一個與x座標相同的點的排序,這可能很有用。

如果您傾向於使用自定義行爲,可以使用typedef pair<float, float> Point;來灌輸typedef pair<float, float> Point;。例如,

typedef pair<float, float> Point; 

enum AxisUnit { x, y }; 
float &operator*(Point &p, AxisUnit c) // "special case" of inner product 
    { return c == x? p.first : p.second; } 

Point my_point(2.5, 6.3); 
float x_coord = my_point * x; 
+0

謝謝,但Point在項目中是固定的。 – Tom 2010-04-16 08:53:09

相關問題