Sortowanie tablicy struktur wg pola struktury

0

Cześć! Mam problem z sortowaniem tablicy struktur wg danego pola. Niestety nadal nie wiem jak to zrobić, próbowałem, czytałem, oglądałem jakieś poradniki i przykłady na YouTube, ale widocznie i słabo szukam i słabo umiem dostosować sortowanie. Jest ktoś w stanie mnie naprowadzić na jakiś trop? A może w inny sposób powinienem zbudować tablicę struktur?
Jeżeli post dodany w złym wątku lub narusza jakieś konkretne zasady i regulamin, proszę o uprzedzenie.
Tak wygląda kod:

#include <iostream>
using namespace std;

//zmienne
struct ksiazka {
    int nr_kat;
    string tytul;
    string autor;
    int l_stron;
    char rodzaj_okladki;
};

string imie[10] = { "Andrzej","Maciek","Marek", "Darek", "Mirek", "Bartek", "Nikodem", "Pawel", "Henryk", "Czarek", };
string tytul_ksiazki[10] = { "Lupa","Dzieci z Bulerbyn","Antagonista", "Miasto 1922", "Franklin i przyjaciele", "Jądro ciemności", "Pan Tadeusz", "Podstawy Przedsiebiorczosci", "Cegielkowo", "Wladcy much", };

//FUNKCJE

ksiazka zbior_ksiazek[10];
int i;


void tworz_ksiazki() {
    for (int i = 0; i < 10; i++)
    {

        zbior_ksiazek[i].nr_kat = i + 1;
        zbior_ksiazek[i].tytul = imie[i];
        zbior_ksiazek[i].autor = tytul_ksiazki[i];
        zbior_ksiazek[i].l_stron = i * i * 9;
        if ((i + 1) % 2 == 0) {
            zbior_ksiazek[i].rodzaj_okladki = 'T';
        }
        else if ((i + 1) % 2 > 0) {
            zbior_ksiazek[i].rodzaj_okladki = 'M';

        }
    }
}

void wys_z_miekka_okladka() {
    for (int i = 0; i < 10; i++)
    {
        if (zbior_ksiazek[i].l_stron > 100) {
            if (zbior_ksiazek[i].rodzaj_okladki = 'M') {
                cout << "NR KAT: " << zbior_ksiazek[i].nr_kat << endl;
                cout << "TYTUL: " << zbior_ksiazek[i].tytul << endl;
                cout << "AUTOR: " << zbior_ksiazek[i].autor << endl;
                cout << "LICZBA STRON: " << zbior_ksiazek[i].l_stron << endl;
                cout << "RODZAJ OKLADKI: " << zbior_ksiazek[i].rodzaj_okladki << endl;
                cout << "_____________________________________________________________________________________________________" << endl;
            }
        }
    }
}

void wys_wszystkie() {
    {
        for (int i = 0; i < 10; i++) {
            cout << "NR KAT: " << zbior_ksiazek[i].nr_kat << endl;
            cout << "TYTUL: " << zbior_ksiazek[i].tytul << endl;
            cout << "AUTOR: " << zbior_ksiazek[i].autor << endl;
            cout << "LICZBA STRON: " << zbior_ksiazek[i].l_stron << endl;
            cout << "RODZAJ OKLADKI: " << zbior_ksiazek[i].rodzaj_okladki << endl;
            cout << "_________________________________________________________________________________" << endl;
        }
    }
}

// w zależnosci czego potrzebujemy (jakiej funkcji) usuwamy tylko znaki "//" z funkcji głównej

//FUNKCJA GLOWNA  
int main()
{

    tworz_ksiazki();
    wys_wszystkie();
    wys_z_miekka_okladka();

    return 0;
}
2
std::sort(std::begin(zbior_ksiazek), std::end(zbior_ksiazek), [](auto const& l, auto const& r){
    return l.nr_kat < r.nr_kat;
});

Tu masz sortowanie rosnące po nr katalogowym.

1

Tu dłuższy opis: http://www.cplusplus.com/articles/NhA0RXSz/ (akapit "Sorting User Made Types.").

0

Dziękuję! Implementuję to bezpośrednio w strukturze?

0

Sortujesz tam, gdzie chcesz sortować.

0

Dobra, wszystko śmiga! Dziękuję za pomoc! :) @kq Kod wrzuciłem do void funckja(){kod} i odpowiednio dostosowałem. Byłbyś w stanie na szybko opisać jak działa kod w trzecim polu w funkcji sort

[](auto const& l, auto const& r)

@Delor Dzięki za materiał, poczytam o tym więcej!

1

To jest wyrażenie lambda (https://en.cppreference.com/w/cpp/language/lambda)
W mocnym uproszczeniu jest to funkcja bez nazwy przyjmująca w tym przypadku 2 parametry.

auto pozwala kompilatorowi samemu wydedukować jaki typ powinien być np. na podstawie innych argumentów poddanych do funkcji std::sort (https://en.cppreference.com/w/cpp/algorithm/sort).

1 użytkowników online, w tym zalogowanych: 0, gości: 1