2010-04-16 2 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_element и std::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

+0

@Tom Проблема заключается в том, что имя 'left' сталкивается с чем-то, если я меняю имя функции на' foo' Мне не нужен функтор, но я могу передать функцию напрямую. –

+0

+1 Если производительность является проблемой, вы можете написать свой собственный алгоритм, который выполняет как один проход по списку, так и возвращает пару минут/макс. –

0

Если вы используете pair<float, float> вместо ваших собственных Point, нет необходимости в специальном компаратора. Также было бы упорядочение на оси y точек с той же координатой x, что может быть полезно.

Существуют различные способы встраивания 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

спасибо, но точка зафиксирована в проекте. – Tom