Ce face std::partial_sort
std::partial_sort aduce la începutul intervalului cele mai mici middle - first elemente, în ordine crescătoare. Elementele de după middle rămân într-o ordine nespecificată.
Este mai rapid decât o sortare completă când ai nevoie doar de un „top”: primele 3 note, cele mai ieftine 10 produse.
Parametri
| Parametru | Descriere |
|---|---|
first, last |
Intervalul complet. |
middle |
Unde se termină partea sortată. Primele middle - first poziții primesc elementele cele mai mici, în ordine. |
comp |
Opțional. Funcția de comparare; cu std::greater<>() obții cele mai mari elemente. |
Ce returnează
Nimic.
Exemple
Exemplul 1: Top 3 punctaje
Afișăm doar primele 3 poziții, singurele garantate ca ordine.
#include <algorithm>
#include <functional>
#include <print>
#include <vector>
int main() {
std::vector<int> punctaje{56, 91, 73, 88, 45, 97, 60};
std::partial_sort(punctaje.begin(), punctaje.begin() + 3, punctaje.end(), std::greater<>());
std::println("Podium: {}, {}, {}", punctaje[0], punctaje[1], punctaje[2]);
}
Rezultat
Podium: 97, 91, 88
Exemplul 2: Cele mai ieftine 2 produse
Varianta ranges primește vectorul și iteratorul de mijloc, plus o proiecție pe câmpul pret.
#include <algorithm>
#include <print>
#include <string>
#include <vector>
struct Produs {
std::string nume;
int pret;
};
int main() {
std::vector<Produs> cos{{"Laptop", 3200}, {"Mouse", 80}, {"Monitor", 900}, {"Cablu", 25}};
std::ranges::partial_sort(cos, cos.begin() + 2, {}, &Produs::pret);
for (int i = 0; i < 2; ++i) {
std::println("{}: {} lei", cos[i].nume, cos[i].pret);
}
}
Rezultat
Cablu: 25 lei
Mouse: 80 lei
Greșeli frecvente
- Citești și elementele de după
middleca și cum ar fi sortate. Ordinea lor nu este garantată.
Comenzi înrudite
std::sort: Sortează elementele dintr-un interval, crescător sau după o regulă dată de tine.std::nth_element: Pune pe poziția n elementul care ar fi acolo după sortare; util pentru mediană sau al k-lea cel mai mic.std::min_element: Găsește cel mai mic (min_element) sau cel mai mare (max_element) element dintr-un interval și returnează un iterator.