std::list::sort în C++

sort() sortează lista schimbând doar legăturile dintre noduri; reverse() inversează ordinea elementelor.

Sintaxă
void sort();
void sort(Compare comparator);
void reverse() noexcept;

Ce face std::list::sort

std::sort din <algorithm> nu merge pe liste, așa că lista are propria funcție sort(). Ea sortează crescător (cu <) sau după un comparator dat de tine. Sortarea este stabilă: elementele egale își păstrează ordinea. Nu se copiază elemente și iteratorii rămân valizi, dar își schimbă poziția în listă.

reverse() inversează lista pe loc, tot doar prin schimbarea legăturilor.

Parametri

Parametru Descriere
comparator Opțional: o funcție care primește două elemente și returnează true dacă primul trebuie să fie înainte.

Ce returnează

Nimic (void).

Exemple

Exemplul 1: Sortare crescătoare, după comparator și inversare

La sortarea după lungime, size() numără octeți: „Iași” are 5, pentru că litera ș ocupă 2 octeți în UTF-8. „Cluj” și „Arad” au aceeași lungime și rămân în ordinea inițială (sortarea este stabilă).

#include <functional>
#include <list>
#include <print>
#include <string>

int main() {
    std::list<int> note{8, 5, 10, 7, 9};
    note.sort();
    std::println("Crescător: {}", note);
    note.sort(std::greater<int>());
    std::println("Descrescător: {}", note);

    std::list<std::string> orase{"Iași", "Cluj", "Timișoara", "Arad"};
    orase.sort([](const std::string& a, const std::string& b) { return a.size() < b.size(); });
    std::println("După lungime: {}", orase);
    orase.reverse();
    std::println("Inversat: {}", orase);
}

Rezultat

Crescător: [5, 7, 8, 9, 10]
Descrescător: [10, 9, 8, 7, 5]
După lungime: ["Cluj", "Arad", "Iași", "Timișoara"]
Inversat: ["Timișoara", "Iași", "Arad", "Cluj"]

Greșeli frecvente

  • Comparatorul tău folosește <= în loc de <. Un comparator trebuie să returneze false pentru elemente egale; altfel rezultatul este comportament nedefinit.

Comenzi înrudite

  • std::list: Listă dublu înlănțuită: inserare și ștergere rapidă oriunde, fără invalidarea celorlalte elemente, dar fără acces după poziție.
  • std::list::splice: splice() mută noduri dintr-o listă în alta fără copiere; merge() interclasează două liste sortate.
  • std::sort: Sortează elementele dintr-un interval, crescător sau după o regulă dată de tine.
  • std::reverse: Inversează pe loc ordinea elementelor dintr-un interval.