【问题标题】:Compare function in a class for std::sort can't compilestd::sort 类中的比较函数无法编译
【发布时间】:2012-12-10 12:50:18
【问题描述】:

我正在编写一个程序来获得一个凸包。我需要按极角对点进行排序,并且我之前选择了一个base 点,所以我编写了一个成员比较函数(请注意,对于每个对象,base 点是不同的)。但是当我将它应用到std::sort 时,程序无法编译。

这是我的程序:

class ConvexHull
{
  Point p[MAXN], base;
public:
  int size;
  void Create(Point (&)[MAXN], const int);
  bool cmp(const Point& a, const Point& b) const
  {
    static int tmp;
    return (tmp = CrossProduct(base, a, base, b)) < 0 || (tmp == 0 && Dist(base, a) < Dist(base, b));
  }
};
void ConvexHull::Create(Point (&a)[MAXN], const int n)
{
  base = a[0];
  for (int i = 1; i < n; ++i)
    if (a[i].x < base.x || (a[i].x == base.x && a[i].y < base.y))
      base = a[i];
  std::sort(a, a+n, cmp);
  p[0] = a[0], p[1] = a[1];
  size = 2;
  for (int i = 2; i < n; ++i)
  {
    while (size >= 2 && CrossProduct(a[i], p[size-1], a[i], p[size-2]) <= 0) --size;
    p[size++] = a[i];
  }
  p[size++] = p[0];
}

这是错误:

poj1113.cc: In member function 'void ConvexHull::Create(Point (&)[1000], int)':
poj1113.cc:41:24: error: no matching function for call to 'sort(Point [1000], Point*, <unresolved overloaded function type>)'
poj1113.cc:41:24: note: candidates are:
In file included from /usr/include/c++/4.7/algorithm:63:0,
                 from poj1113.cc:3:
/usr/include/c++/4.7/bits/stl_algo.h:5463:5: note: template<class _RAIter> void std::sort(_RAIter, _RAIter)
/usr/include/c++/4.7/bits/stl_algo.h:5463:5: note:   template argument deduction/substitution failed:
poj1113.cc:41:24: note:   candidate expects 2 arguments, 3 provided
In file included from /usr/include/c++/4.7/algorithm:63:0,
                 from poj1113.cc:3:
/usr/include/c++/4.7/bits/stl_algo.h:5499:5: note: void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = Point*; _Compare = bool (ConvexHull::*)(const Point&, const Point&)const]
/usr/include/c++/4.7/bits/stl_algo.h:5499:5: note:   no known conversion for argument 3 from '<unresolved overloaded function type>' to 'bool (ConvexHull::*)(const Point&, const Point&)const'

如何解决?这(我的意思是让base 成员)是一个糟糕的设计吗?

【问题讨论】:

  • 您不需要将数组作为参考传递给Create 函数,除非您打算分配给实际变量,例如a = foo.

标签: c++ sorting stl


【解决方案1】:

问题是您的cmp 方法必须是static。原因是非静态方法需要一个不可见的第一个参数,this 指针。 std::sort 函数传递这个额外的参数。

由于您引用了成员变量,您无法创建函数static,但还有其他方法可以解决这个问题。我建议使用新的 C++11 标准功能,std::bind

std::sort(a, a+n, std::bind(&ConvexHull::cmp, this));

std::bind调用创建了一个可调用对象,将第一个参数设置为this,这样在调用的时候就正确了。

【讨论】:

  • 但我需要base,它是一个班级成员。 ??
  • 你不需要它成为类成员,创建一个全局函数bool Compare(const point&amp; base, const point&amp; p1, const point&amp; p2) 并使用 boost::bind 或 C++11 lambdas 来“修复”第一个参数。
  • @AlexanderChertov 啊哈,这真是一个更好的设计。
猜你喜欢
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2013-12-01
  • 2018-12-28
  • 1970-01-01
相关资源
最近更新 更多