Sortowanie wektora zawierającego elementy klasy
Ostatnio zmodyfikowano 2015-09-06 22:41
Fireho |
» 2015-09-06 19:02:57 Ta funkcja bierze dwa punkty i sprawdza czy współrzędna x pierwszego jest mniejsza od drugiego - ignoruje współrzędna y, a taką funkcje trzeba przekazać std::sort aby on użył jej do sortowania. |
|
Asahel Temat założony przez niniejszego użytkownika |
» 2015-09-06 19:51:00 Zrobiłem to. Program po modyfikacji wygląda tak: #include<iostream> #include<vector> #include <algorithm> #include <functional> using namespace std;
class wsp { public: int x; int y; wsp( int xx, int yy ); }; wsp::wsp( int xx, int yy ) : x( xx ) , y( yy ) { };
vector < wsp > tab;
bool sort_by_x( const wsp & lhs, const wsp & rhs ) { return lhs.x < rhs.x; };
int main() { int a, b; while( cin >> a >> b ) { tab.push_back( wsp( a, b ) ); } sort( tab.begin(), tab.end(), sort_by_x ); for( int i = 0; i < tab.size(); i++ ) { cout << i << "____" << tab[ i ].x << "____" << tab[ i ].y << endl; } }
Skorzystałm po prostu z tutoriala, ale nie do końca rozumiem tą funkcję. bool sort_by_x( const wsp & lhs, const wsp & rhs ) { return lhs.x < rhs.x; };
Rozumiem, że idea tej funkcji to określenie po prostu jak ma posortować podaną listę funkcja sort(). OK - to rozumiem. Ale jak to się tam odbywa w środku to już magia. Sama budowa funkcji sort_by_x to też dla mnie magia, bierze ona adresy do dwóch argumentów, które są constant - nie wiadomo, czy to parametr x, czy y?! a zwraca jakiś mniejszy parametr. Dosyć zagadkowo to wygląda wszystko :/ Jak ktoś by miał chwilę aby to jakoś ładnie wytłumaczyć, to będę wdzięczny :)! |
|
Fireho |
» 2015-09-06 22:41:43 Gdyby argument był typu wsp , zostałaby wykonana kopia - tak działa przekazywanie argumentów przez wartość. Żeby nie kopiować niepotrzebnie, przekazujemy referencję do oryginału - wsp & . const natomiast dodajemy po to, aby dało się przekazać referencję do stałych obiektów - nie potrzebujemy zmieniać niczego podczas porównywania, więc czemu nie(dzięki temu możemy też przekazywać obiekty tymczasowe). Jeśli chodzi o wnętrze, to jest to zwyczajne użycie operatora < - sprawdza czy współrzędna x pierwszego punktu jest mniejsza niż współrzędna x drugiego punktu. Jeśli jest, to zwraca prawdę( true ), jeśli nie to fałsz( false ). Słowo kluczowe return powoduje zwrócenie wyniku tej operacji. |
|
1 « 2 » |