Как написать функцию сравнения внутри класса, когда другая функция использует это для сортировки?

0

Я пытаюсь найти выпуклую оболочку некоторых точек в C++ объектно-ориентированным способом. Итак, для этого я определил пользовательскую функцию сравнения. Но дело в том, что я не могу сортировать значения внутри функции класса. Моя проблема заключается в строке 46, которая является строкой 3 в функции find_convex_hull: Здесь мой код

#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;

    }

}

Я попробовал это принятое решение, поэтому в строке 46 я использовал функцию bind. Но я получаю много ужасных ошибок. Я не хочу, чтобы статическая причина была функцией сравнения, тогда мне нужно изменить многие вещи на статические. Есть ли способ сделать это?

  • 0
    Ваш point_compare compare(ii p1,ii p2,ii p0) принимает три аргумента, тогда как std :: sort ожидает binary predicate . Вы bind(&convex_hull::sort_compare виду использовать bind(&convex_hull::sort_compare вместо bind(&convex_hull::compare ?
  • 0
    Да, это была именно ошибка. Спасибо !!!
Показать ещё 4 комментария
Теги:
computational-geometry
stl

1 ответ

-2
Лучший ответ

Здесь BUG находится в вызывающей функции sort(). Как упоминал Петр С. в комментариях, я использовал bind(&convex_hull::compare который принимает 3 аргумента вместо bind(&convex_hull::sort_compare который принимает 2 аргумента для std :: sort.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню