Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 5711 razy

Można by się bawić w tworzenie własnego algorytmu sortującego elementy kontenera vector, jednakże nie ma takiej potrzeby albowiem istnieją już gotowe rozwiązania tego problemu zaimplementowane w pliku nagłówkowym algorithm. Zanim jednak przejdę do rzeczy konieczne jest zaimplementowanie jakiejś przykładowej klasy z obsługą operatora <. Ponieważ już wcześniej tworzyłem taką klasę, więc wystarczy nią się tutaj posłużyć:

#include <iostream> #include <vector> #include <math.h> #include <windows.h> #include <algorithm> #include <stdlib.h> #include <time.h> using namespace std; class point2d{ private: double x; double y; public: point2d():x(0), y(0){} point2d(double x,double y):x(x), y(y){} point2d(const point2d &p):x(p.x), y(p.y){} inline double GetLength() const {return sqrt(x * x + y * y);} inline double GetX() const {return x;} inline double GetY() const {return y;} // operator podstawiania point2d & operator =(const point2d &p){ x = p.x; y = p.y; return *this;}; // proste podstawienie void operator =(double length){ // ustaiwa długość wektora if(x!=0 && y !=0){ // gdy jego wartość nie jest równa zero double k = length / GetLength(); // oblicz współczynnik skalowania x *= k; // skalowanie x y *= k; // skalowanie y } }; // operatory porównania wartości inline bool operator == (const point2d &p) const {return x * x + y * y == p.x * p.x + p.y * p.y;}; inline bool operator == (const double &length) const {return x * x + y * y == length * length;}; inline bool operator != ( point2d &p) const {return x * x + y * y != p.x * p.x + p.y * p.y;}; inline bool operator != (const double &length) const {return x * x + y * y != length * length;}; inline bool operator <(const point2d &p) const {return x * x + y * y < p.x * p.x + p.y * p.y;}; inline bool operator <(const double &length) const {return x * x + y * y < length * length;}; inline bool operator >(const point2d &p) const {return x * x + y * y > p.x * p.x + p.y * p.y;}; inline bool operator >(const double &length) const {return x * x + y * y > length * length;}; inline bool operator >=(const point2d &p) const {return x * x + y * y >= p.x * p.x + p.y * p.y;}; inline bool operator >=(const double &length) const {return x * x + y * y >= length * length;}; inline bool operator <=(const point2d &p) const {return x * x + y * y <= p.x * p.x + p.y * p.y;}; inline bool operator <=(const double &length) const {return x * x + y * y <= length * length;}; // Operatory matematyczne inline point2d & operator +=(const point2d &p){x += p.x; y += p.y; return *this;}; /*point2d operator +(point2d p){ point2d p1(x + p.x, y + p.y); return p1;};*/ }; ostream & operator << (ostream &iostr, const point2d &p2d){ return iostr << "x = "<<p2d.GetX()<<"; y = "<<p2d.GetY()<<";"; } point2d operator +(const point2d &p1, const point2d &p2){ point2d p = p1; p += p2; return p; } bool operator == (const double &length, const point2d &p){ return p == length; // wykorzystanie operatora zawartego w definicji klasy point2d } bool operator != (const double &length, const point2d &p){ return p != length; // wykorzystanie operatora zawartego w definicji klasy point2d } bool operator < (const double &length, const point2d &p){ return p < length; // wykorzystanie operatora zawartego w definicji klasy point2d } bool operator > (const double &length,const point2d &p){ return p > length; // wykorzystanie operatora zawartego w definicji klasy point2d } bool operator <= (const double &length,const point2d &p){ return p <= length; // wykorzystanie operatora zawartego w definicji klasy point2d } bool operator >= (const double &length,const point2d &p){ return p >= length; // wykorzystanie operatora zawartego w definicji klasy point2d }

Powyższy kod obsługuje wiele operatorów, lecz dla algorytmu sortującego będzie potrzebny jedynie operator <, zanim jednak pokażę, jak go wykorzystuje pierwszy wariant funkcji sort, utworzę jeszcze funkcję porównującą dwa elementy według innych kryteriów:

bool check_point2d(point2d p1, point2d p2){ // funkcja spradzająca czy x z p1 jest mniejszy od x z p2 return p1.GetX() < p2.GetX(); }

Teraz już można przykładowy kod sortowania stworzyć:

int main(){ setlocale(LC_CTYPE,"Polish"); // żeby polskie znaki były (windows.h) vector<point2d> tPoint2d; srand(time(NULL)); // ustawienie losowanka for(int i = 0; i < 10; i++){ tPoint2d.push_back(point2d(rand() % 1000, rand() % 1000)); // losowanie } cout<<"Przed posortowaniem według długości: "<<endl<<endl; for(std::vector<point2d>::iterator i = tPoint2d.begin(); i < tPoint2d.end(); i++){ cout<<"Długość wektora: "<<(*i).GetLength()<<" "<<*i<<endl; // wyświetlanie } sort(tPoint2d.begin(),tPoint2d.end()); // sortowanie z wykorzystaniem operatora < cout<<endl<<"Po posortowaniu według długości: "<<endl<<endl; for(std::vector<point2d>::iterator i = tPoint2d.begin(); i < tPoint2d.end(); i++){ cout<<"Długość wektora: "<<(*i).GetLength()<<" "<<*i<<endl; // wyświetlanie } sort(tPoint2d.begin(),tPoint2d.end(),check_point2d); // sortowanie z przebiegłym wykorzystaniem funkcji check_point2d cout<<endl<<"Po posortowaniu według współrzędnej x: "<<endl<<endl; for(std::vector<point2d>::iterator i = tPoint2d.begin(); i < tPoint2d.end(); i++){ cout<<*i<<endl; // wyświetlanie } cout<<"Wcisnij enter, aby zamknac program..."; cin.get(); return 0; }

Wynik działania:

Przed posortowaniem według długości:

Długość wektora: 1208.53 x = 823; y = 885;
Długość wektora: 922.736 x = 185; y = 904;
Długość wektora: 646.743 x = 624; y = 170;
Długość wektora: 334.964 x = 99; y = 320;
Długość wektora: 799.436 x = 547; y = 583;
Długość wektora: 574.474 x = 554; y = 152;
Długość wektora: 553.521 x = 417; y = 364;
Długość wektora: 754.036 x = 87; y = 749;
Długość wektora: 844.009 x = 836; y = 116;
Długość wektora: 467.898 x = 448; y = 135;

Po posortowaniu według długości:

Długość wektora: 334.964 x = 99; y = 320;
Długość wektora: 467.898 x = 448; y = 135;
Długość wektora: 553.521 x = 417; y = 364;
Długość wektora: 574.474 x = 554; y = 152;
Długość wektora: 646.743 x = 624; y = 170;
Długość wektora: 754.036 x = 87; y = 749;
Długość wektora: 799.436 x = 547; y = 583;
Długość wektora: 844.009 x = 836; y = 116;
Długość wektora: 922.736 x = 185; y = 904;
Długość wektora: 1208.53 x = 823; y = 885;

Po posortowaniu według współrzędnej x:

x = 87; y = 749;
x = 99; y = 320;
x = 185; y = 904;
x = 417; y = 364;
x = 448; y = 135;
x = 547; y = 583;
x = 554; y = 152;
x = 624; y = 170;
x = 823; y = 885;
x = 836; y = 116;
Wcisnij enter, aby zamknac program...

W pliku nagłówkowym algorithm znajduje się również funkcja is_sorted w dwóch wersjach tak jak funkcja sort a zadanie tej funkcji wydaje się być oczywiste, czyli sprawdzanie czy zawartość kontenera została posortowana według określonych kryteriów.

Layout wykonany przez autora strony, wszelkie prawa zastrzeżone. Jakiekolwiek użycie części lub całości grafik znajdujących się na tej stronie bez pisemnej zgody jej autora surowo zabronione.