std::set în C++

Mulțime ordonată de valori unice: elimină automat duplicatele și păstrează elementele sortate.

Sintaxă
#include <set>

std::set<T> nume;
std::set<T> nume{v1, v2, v3};

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ște auto 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.