1

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;
}
4

3 に答える 3

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)
于 2010-04-16T08:36:10.177 に答える
0

さらに良いのは、ブースト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;
于 2010-04-17T21:23:26.687 に答える
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;
于 2010-04-16T08:48:51.853 に答える