为什么这个样本有效?

时间:2009-04-23 06:58:38

标签: c++ stl functor

  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? 重载operator()如何正确使用?

3 个答案:

答案 0 :(得分:4)

当您在sort_by_polar_angle()函数中调用sort()时,您正在创建类型为sort_by_polar_angle的临时对象(即调用其构造函数)。在排序算法中,您传递的仿函数对象使用类似functor()的内容,将其转换为functor.operator()

答案 1 :(得分:0)

对于距离中心的直线上的点不起作用。这些的“角度”是相等的,因此它们的顺序不确定。对这些点进行排序将返回未确定的结果。

那是因为任何“排序”操作都应该是“严格的”:如果一个&lt; b,然后b>一个。 (实际上definition有点复杂。)

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

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

答案 2 :(得分:0)

尝试使用here来了解函子的基本介绍,或google for c++ functor