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() が呼び出されると、コンストラクタとして機能しますか? オーバーロードされた演算子 () はどのように正しく使用されましたか?

4

3 に答える 3

4

関数を呼び出すsort_by_polar_angle()と、sort()タイプの一時オブジェクトが作成されますsort_by_polar_angle(つまり、そのコンストラクターが呼び出されます)。ソート アルゴリズム内では、渡された functor オブジェクトが使用され、functor()に変換されfunctor.operator()ます。

于 2009-04-23T07:07:59.930 に答える
0

ファンクターとは何かの基本的な紹介についてはこちらを、 C++ファンクターについてはグーグルでお試しください。

于 2009-04-24T02:13:45.047 に答える