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

Przeciążanie operatorów C++

0 głosów
514 wizyt
pytanie zadane 20 lutego 2023 w C i C++ przez polandonion Dyskutant (7,700 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 Mentor (354,880 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 Dyskutant (7,700 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 (158,960 p.)

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

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

Podobne pytania

0 głosów
1 odpowiedź 291 wizyt
+1 głos
0 odpowiedzi 668 wizyt
0 głosów
1 odpowiedź 828 wizyt

93,692 zapytań

142,611 odpowiedzi

323,220 komentarzy

63,220 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...