• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przeciążanie operatorów C++

Object Storage Arubacloud
0 głosów
205 wizyt
pytanie zadane 20 lutego 2023 w C i C++ przez polandonion Mądrala (7,040 p.)

Siema, mam do Was pytanko odnośnie przeciążania operatorów w C++. Mianowicie załóżmy, że mam strukturę jakichśtam obiektów. Niech to będzie struktura Punkt2D przechowująca dwie zmienne: zmienną X oraz Y kartezjańskiego układu współrzędnych. Mam je teraz posortować względem odległości od punktu S(0, 0), a gdy dwa punkty są jednakowo oddalone od punktu S, sortujemy względem zmiennej X rosnąco.

struct Punkt2D {
    int X, Y;
    double R;
};

No i wszystko gra, tylko, że do tej pory robiłem to tak (sortowanie):

  • tworzyłem pomocniczą funkcję typu bool, która posłuży jako argument metody std::sort()
  • wywoływałem metodę std::sort() z moją pomocniczą funkcją typu bool

Wygląda to mniej więcej tak:

#include <iostream>
#include <algorithm>

#define N 3

struct Punkt2D {
	int X, Y, R;
	// R - odleglosc od pkt S(0, 0)
};

bool cmp(Punkt2D &a, Punkt2D &b) {
	if (a.R == b.R)
		return (a.X < b.X);
	return (a.R < b.R);
}

int main() {
	Punkt2D tab[] = {{3, 4, 5},
					{4, 3, 5},
					{5, 12, 13}};

	std::sort(tab, tab + N, cmp);
	return 0;
}

 

Czasem jednak mam dosyć linii kodu, żeby się zgubić i mam pytanie: jak (bo wiem, że się jakoś da, tylko nie wiem jak) zrobić, żeby niejako nie trzeba było tworzyć funkcji cmp()? Wiem, że jakoś da się przeciążać operatory, ale chciałbym nauczyć się konkretnie na tym przykładzie, bo na internecie podają np. jak przeciążyć operator dodawania, tutaj to jest bezużyteczne.

Dzięki z góry za poświęcony czas i nadsyłane komentarze i odpowiedzi :D

1 odpowiedź

+1 głos
odpowiedź 20 lutego 2023 przez adrian17 Ekspert (344,860 p.)
 
Najlepsza

Dla std::sort, wystarczy przeładować operator porównania `<`:

struct Punkt2D {
    int X, Y, R;

    bool operator<(const Punkt2D &b) const
    {
        return //...jakas implementacja porownania...;
    }
};

Idealnie ofc polecam też dodać pozostałe przeładowane operatory porównania, ale do samego std::sorta nie jest to konieczne.

komentarz 22 lutego 2023 przez polandonion Mądrala (7,040 p.)

@adrian17, a dlaczego akurat przeciążasz operator <, a nie np. > ?

Co by się stało w kodzie, gdybyś to zmienił?

1
komentarz 22 lutego 2023 przez mokrowski Mędrzec (155,460 p.)

https://en.cppreference.com/w/cpp/algorithm/sort

sekcja Parameters: ".... if the first argument is less than ...."

Podobne pytania

+1 głos
0 odpowiedzi 349 wizyt
0 głosów
1 odpowiedź 453 wizyt
0 głosów
1 odpowiedź 970 wizyt

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...