Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sortowanie wektora zawierającego elementy klasy

Ostatnio zmodyfikowano 2015-09-06 22:41
Autor Wiadomość
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.
P-137300
Asahel
Temat założony przez niniejszego użytkownika
» 2015-09-06 19:51:00
Zrobiłem to. Program po modyfikacji wygląda tak:

C/C++
#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ę.

C/C++
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 :)!
P-137302
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.
P-137304
1 « 2 »
Poprzednia strona Strona 2 z 2