查找列表的最左侧和最右侧的点。 std :: find_if是正确的方法吗?

时间:2010-04-16 08:31:56

标签: c++ stl find comparator

我有一个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 个答案:

答案 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)

答案 1 :(得分:0)

如果您使用pair<float, float>而不是自己的Point,则无需使用特殊的比较器。在具有相同x坐标的点的y轴上也会有一个排序,这可能很有用。

如果您愿意,有多种方法可以让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;

答案 2 :(得分:0)

更好的是使用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;