当另一个函数使用它来排序时,如何在类中编写比较函数?

时间:2014-08-22 10:46:28

标签: c++ stl computational-geometry

我试图以面向对象的方式在C ++中找到某些点的凸包。所以,为此,我定义了一个自定义比较函数。但问题是我无法对类函数中的值进行排序。我的问题是在第46行,即find_convex_hull函数的第3行: 这是我的代码

#include <iostream>
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> ii;

class convex_hull{
    enum point_compare {greater,smaller,equal};
    vector<ii> points;
    vector<ii> convexHull;
    ii p0;
public:
    convex_hull(vector<ii> init)
    {
        sort(init.begin(),init.end());
        points = init;
        p0 = init[0];
    }
    int cross_product(ii p1,ii p2,ii p0)
    {
        return ((p1.x-p0.x)*(p2.y-p0.y))-((p1.y-p0.y)*(p2.x-p0.x));
    }
    point_compare compare(ii p1,ii p2,ii p0)
    {
        int d = cross_product(p1,p2,p0);
        if(d>0)
            return smaller;
        else if(d<0)
            return greater;
        else
            return equal;
    }
    bool sort_compare(ii p1,ii p2)
    {
        point_compare x = compare(p1,p2,p0);
        if(x == smaller)
            return true;
        else if(x == equal)
            return p1<p2;
        return false;
    }
    stack<ii> find_convex_hull()
    {
        vector<ii> polar_sorted = points;
        sort(polar_sorted.begin()+1,polar_sorted.end(),bind(&convex_hull::compare,this,placeholders::_1,placeholders::_2));
        stack<ii> res;
        res.push(p0);
        res.push(polar_sorted[1]);
        res.push(polar_sorted[2]);
        for(int i=3;i<polar_sorted.size();++i)
        {
            ii _y = res.top(); res.pop();
            ii _x = res.top();
            ii _z = polar_sorted[i];
            if(compare(_y,_z,_x) != greater)
                res.push(_y);
            res.push(_z);
        }
        return res;
    }
};

int main()
{

    vector<ii> points({{0, 3}, {1, 1}, {2, 2}, {4, 4},
                       {0, 0}, {1, 2}, {3, 1}, {3, 3}});
    convex_hull A(points);
    stack<ii> res = A.find_convex_hull();
    while(!res.empty())
    {
        ii x = res.top();
        res.pop();
        cout<<x.x<<" "<<x.y<<endl;

    }

}

我尝试了this接受的解决方案,所以在第46行我使用了bind函数。但是我收到了很多可怕的错误。我不想让比较函数静态,因此我必须将许多东西改为静态。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:-1)

这里的BUG在调用函数sort()中。正如Piotr S.在评论中提到的,我使用了bind(&convex_hull::compare,它取3个参数而不是bind(&convex_hull::sort_compare。它为std :: sort提供了2个参数。