2009-04-23 9 views
0
typedef pair<double, double> dd; 

    const double epsilon = 1e-6; 

    struct sort_by_polar_angle { 
    dd center; 
    // Constuctor of any type 
    // Just find and store the center 
    template<typename T> sort_by_polar_angle(T b, T e) { 
     int count = 0; 
     center = dd(0,0); 
     while(b != e) { 
        center.first += b->first; 
        center.second += b->second; 
       b++; 
      count++; 
     } 
       double k = count ? (1.0/count) : 0; 
     center.first *= k; 
       center.second *= k; 
    } 
    // Compare two points, return true if the first one is earlier 
    // than the second one looking by polar angle 
    // Remember, that when writing comparator, you should 
    // override not ‘operator <’ but ‘operator()’ 
    bool operator() (const dd& a, const dd& b) const { 
     double p1 = atan2(a.second-center.second, a.first-center.first); 
     double p2 = atan2(b.second-center.second, b.first-center.first); 
     return p1 + epsilon < p2; 
    } 
    }; 

// ... 

vector <dd> points; 

sort(all(points), sort_by_polar_angle(all(points))); 

sort_by_polar_angle()が呼び出されたとき、それはconstrunctorとして機能していますか? オーバーロードされた演算子()は正しく使用されましたか?このサンプルはなぜ機能するのですか?

+0

all()は何ですか、sort_by_polar_angleはコンストラクタですが、引数の数が異なるため、あなたが示したものではありません。 – Patrick

+0

それも間違っています。あなたは間違いなく注文のイプシロンを持っていないはずです。 a == bかつa == cならばb == c。 – MSalters

+1

明らかに醜いですが、私はすべて(C)が "C.begin()、C.end()"の#defineとして定義されなければならないと確信しています。 –

答えて

4

sort()関数でsort_by_polar_angle()を呼び出すと、タイプsort_by_polar_angle(つまりそのコンストラクターが呼び出されます)の一時オブジェクトが作成されます。ソートアルゴリズムの中で、渡したファンクタオブジェクトはfunctor()のようなものが使われ、functor.operator()に翻訳されます。

0

中心から一直線上の点では機能しません。これらの「角度」は等しいので、その順序は決定されません。これらのポイントをソートすると、未定義の結果が返されます。

これは、「ソート」操作が「厳密」でなければならないからです。< b、b> aの場合です。 (実際にdefinitionはやや複雑です。)

dd a0 = { 0, 1 }; 
dd b0 = { 0, 2 }; 

assert(sort_by_polar_angle()(a0, b0) && ! sort_by_polar_angle() (b0, a0)); 
0

は、基本的なファンクタが何であるかを紹介、またはgoogle for c++ functorためhereを試してみてください。

関連する問題