我有一个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;
}
答案 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)
答案 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;