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 luiintși sortarea iese greșită. - Sortezi cu
qsortun tablou destd::stringsau 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).