Нахождение самой левой и самой правой точек списка. std :: find_if правильный путь? - PullRequest
1 голос
/ 16 апреля 2010

У меня есть список объектов Point (каждый со свойствами x, y), и я хотел бы найти самые левые и самые правые точки. Я пытался сделать это с помощью find_if, но я не уверен, что это путь, потому что я не могу передать экземпляр компаратора. Find_if путь? Кажется нет. Итак, есть ли в <algorithm> алгоритм для достижения этой цели?

Заранее спасибо.

#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 ]

3 голосов
/ 16 апреля 2010

Используйте 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 голосов
/ 18 апреля 2010

еще лучше было бы использовать элемент boost minmax:

http://www.boost.org/doc/libs/1_42_0/libs/algorithm/minmax/index.html

#include <boost/algorithm/minmax_element.hpp>
...
auto res = boost::minmax_element(points.begin(), points.end(), left);

std::cout << "min: " << res.first << std::endl;
std::cout << "max: " << res.second << std::endl;
0 голосов
/ 16 апреля 2010

Если вы используете 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;
...