std::qsort în C++

Funcția de sortare din C: sortează un tablou primind dimensiunea elementelor și o funcție de comparare cu void*.

Sintaxă
void qsort(void* baza, std::size_t numar, std::size_t marime, int (*comp)(const void*, const void*));

Ce face std::qsort

std::qsort vine din C și lucrează cu memorie brută: primește adresa tabloului, numărul de elemente, mărimea unui element (sizeof) și o funcție care compară două elemente prin pointeri const void*. Funcția returnează un număr negativ, zero sau pozitiv.

În C++ aproape întotdeauna std::sort este mai bun: este mai sigur la tipuri și de obicei mai rapid, pentru că funcția de comparare poate fi inclusă direct în cod. qsort merge doar pentru tipuri simple, care pot fi copiate octet cu octet (nu pentru std::string). Îl întâlnești în cod vechi sau la interfața cu biblioteci C.

Parametri

Parametru Descriere
baza Adresa primului element.
numar Numărul de elemente.
marime Mărimea unui element, în octeți.
comp Funcția de comparare: <0, 0 sau >0.

Ce returnează

Nimic.

Exemple

Exemplul 1: Sortarea unui tablou de int

Comparatorul folosește (x > y) - (x < y) în loc de x - y, care poate depăși limita lui int.

#include <cstdlib>
#include <print>

int compara(const void* a, const void* b) {
    int x = *static_cast<const int*>(a);
    int y = *static_cast<const int*>(b);
    return (x > y) - (x < y);
}

int main() {
    int note[] = {7, 10, 4, 9, 5};
    std::qsort(note, 5, sizeof(int), compara);

    for (int n : note) {
        std::print("{} ", n);
    }
    std::println("");
}

Rezultat

4 5 7 9 10

Exemplul 2: Același lucru cu std::sort

#include <algorithm>
#include <iterator>
#include <print>

int main() {
    int note[] = {7, 10, 4, 9, 5};
    std::sort(std::begin(note), std::end(note));

    for (int n : note) {
        std::print("{} ", n);
    }
    std::println("");
}

Rezultat

4 5 7 9 10

Greșeli frecvente

  • Comparatorul returnează a - b: pentru valori mari depășește limita lui int și sortarea iese greșită.
  • Sortezi cu qsort un tablou de std::string sau alte obiecte cu memorie proprie: comportament nedefinit.

Comenzi înrudite

  • std::sort: Sortează elementele dintr-un interval, crescător sau după o regulă dată de tine.
  • std::ranges::sort: Sortează un container întreg dintr-un apel, cu opțiunea de a sorta după un câmp (proiecție).