Ce face std::set
std::set ține valori fără repetiții, mereu sortate crescător. Dacă adaugi o valoare care există deja, nu se întâmplă nimic. Adăugarea, căutarea și ștergerea durează O(log n).
Este potrivit când vrei să știi rapid dacă ai văzut deja o valoare, sau ca să elimini duplicatele dintr-o listă și să o sortezi în același timp. Elementele nu pot fi modificate pe loc (sunt const), pentru că o schimbare ar strica ordinea: ștergi valoarea veche și o inserezi pe cea nouă.
Pentru o ordine descrescătoare, scrie std::set<int, std::greater<int>>. Dacă ordinea nu contează, std::unordered_set este de obicei mai rapid.
Parametri
| Parametru | Descriere |
|---|---|
T |
Tipul elementelor; trebuie să poată fi comparat cu < (sau dai un comparator). |
Ce returnează
Un obiect set.
Exemple
Exemplul 1: Eliminarea duplicatelor
#include <print>
#include <set>
#include <string>
#include <vector>
int main() {
std::vector<std::string> vizitatori{"Ana", "Ion", "Ana", "Dan", "Ion", "Ana"};
std::set<std::string> unici(vizitatori.begin(), vizitatori.end());
std::println("{} vizite, {} vizitatori unici: {}", vizitatori.size(), unici.size(), unici);
}
Rezultat
6 vizite, 3 vizitatori unici: {"Ana", "Dan", "Ion"}
Exemplul 2: Ordine descrescătoare și cel mai mic / mare element
#include <functional>
#include <print>
#include <set>
int main() {
std::set<int> note{7, 10, 5, 9, 10};
std::println("{} min={} max={}", note, *note.begin(), *note.rbegin());
std::set<int, std::greater<int>> descrescator(note.begin(), note.end());
std::println("{}", descrescator);
}
Rezultat
{5, 7, 9, 10} min=5 max=10
{10, 9, 7, 5}
Greșeli frecvente
- Încerci să modifici un element prin iterator (
*it = 5). Nu compilează; șterge valoarea veche și inserează-o pe cea nouă. - Folosești un set de structuri proprii fără
operator<sau fără comparator: eroare de compilare lungă. Defineșteauto operator<=>(const T&) const = default;sau dă un comparator.
Comenzi înrudite
std::set::insert: Adaugă o valoare în set dacă nu există deja și spune prin rezultat dacă a fost adăugată.std::set::find: Caută o valoare în set: find() returnează un iterator (sau end()), contains() și count() spun dacă există.std::set::erase: Șterge din set o valoare, elementul indicat de un iterator sau un interval de elemente.std::multiset: Mulțime ordonată care permite valori repetate; util pentru valori sortate cu frecvență.std::unordered_set: Mulțime de valori unice bazată pe hash: verificare „există?” în timp mediu constant, fără ordine.std::map: Dicționar ordonat: asociază fiecărei chei unice o valoare și păstrează cheile sortate.