Sortowanie współrzędnych (x,y) za pomocą sort()

0

Witam mam do posortowania wektor punktów w czasie nlogn a najlepiej jakbym użył funkcji sort() z STL.
Niestety gdy chce użyć sortowania program się nie kompiluje a przeciążyłem operator > i < do sortowania.
Nie wiem co dokładnie robię źle więc proszę o wskazówki i pomoc.

Klasa i przeciążenie

#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <list>
#include<ctime>

using namespace std;

class Point
{

 public:
    double x;
    double y;

    bool operator<(Point &p)
    {
        if(x<p.x)
        return true;
        if(x==p.x)
            if(y<p.y)
            return true;
            else
            return false;
        if(x>p.x)
        return false;
    }

    bool operator>(Point &p)
    {
        if(x>p.x)
        return true;
        if(x==p.x)
            if(y>p.y)
            return true;
            else
            return false;
        if(x>p.x)
        return false;
    }

};
//takie cos probuje uzyc w programie i sie nie kompiluje
//p to jest vector<Point>;
sort(p.begin(),p.end());

Cały kod:

#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <list>
#include<ctime>

using namespace std;

class Point
{

 public:
    double x;
    double y;

    bool operator<(Point &p)
    {
        if(x<p.x)
        return true;
        if(x==p.x)
            if(y<p.y)
            return true;
            else
            return false;
        if(x>p.x)
        return false;
    }

    bool operator>(Point &p)
    {
        if(x>p.x)
        return true;
        if(x==p.x)
            if(y>p.y)
            return true;
            else
            return false;
        if(x>p.x)
        return false;
    }

};


bool zakret(Point p1, Point p2, Point p3)
{
    double wyznacznik=0.0;
    wyznacznik=(((p3.x-p1.x)*(p2.y-p1.y))-((p3.y-p2.y)*(p2.x-p1.x)));
    if(wyznacznik>0)
    return true;
    if(wyznacznik<0)
    return false;
}


int main()
{
    srand(time(NULL));
clock_t poczatek, koniec;
double time;
vector<Point> p;

    int ile=0;
    cout<<"Ile punktow: "; cin>>ile;
Point punkt1;

cout<<"\nPrzed sortowaniem"<<endl;
for(int i=0; i<ile;i++)
{
    punkt1.x=double(0.0+rand() % 1000);
    punkt1.y=double(0.0+rand() % 1000);
 //   cout<<"Punkt "<<i<<": x="<<punkt1.x<<", y="<<punkt1.y<<endl;
  p.push_back(punkt1);
}



poczatek=clock();
//sort(p.begin(),p.end());
vector<Point> s1;
vector<Point> s2;
s1.push_back(p[0]);
s1.push_back(p[1]);

cout<<"\nOtoczka gorna: ";
for(int i=2; i<p.size();i++)
{
    s1.push_back(p[i]);
    while(s1.size()>=2 && zakret(s1[s1.size()-2], s1[s1.size()-1], p[i])==0)
    {
       punkt1=s1[s1.size()-1];
       s1.pop_back();
       cout<<"x="<<punkt1.x<<", y="<<punkt1.y<<endl;
    }
}


s2.push_back(p[p.size()-1]);
s2.push_back(p[p.size()-2]);

cout<<"\nOtoczna dolna: ";
for(int i=p.size()-3; i>0 ;i--)
{
    s2.push_back(p[i]);
    while(s2.size()>=2 && zakret(s2[s2.size()-2], s2[s2.size()-1], p[i])==0)
    {
        punkt1=s2[s2.size()-1];
        s2.pop_back();
        cout<<"x="<<punkt1.x<<", y="<<punkt1.y<<endl;
    }
}

cout<<endl;
koniec=clock();
time=koniec-poczatek;
cout<<"\n"<<endl;
cout<<endl<<"Czas dzialania: "<<endl;
cout<<"otoczka (metoda lancuchow): "<<time<<endl;

    return 0;
}
1

Przeczytaj komunikat błędu.

http://ideone.com/D4ZWc1 :

/usr/include/c++/4.7/bits/stl_algo.h4: note: candidates are:
prog.cpp10: note: bool Point::operator<(Point&)
prog.cpp10: note: no known conversion for argument 1 from ‘const Point’ to ‘Point&’

Operator porównania nie powinien tak wyglądać. Powinno być

bool operator<(const Point &p) const {
  // ...

Przecież nie modyfikujesz ani obiektu p ani tego obiektu, na rzecz którego wywołuje się funkcja.

0

Sortowanie znalezione gdzieś w sieci:

 bool cmp (const Point &a, const Point &b) {
   if (a.x == b.x)
     return a.y < b.y;
   else
     return a.x < b.x;
 }

std::sort(p.begin(),p.end(), cmp);
0

dzięki wielkie za pomoc
problem rozwiązany :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1