std::unique în C++

Elimină duplicatele aflate unul lângă altul; după sortare, elimină toate duplicatele.

Sintaxă
ForwardIt unique(ForwardIt first, ForwardIt last);
ForwardIt unique(ForwardIt first, ForwardIt last, BinaryPred egal);

Ce face std::unique

std::unique păstrează doar primul element din fiecare grup de elemente egale consecutive. Ca std::remove, nu micșorează containerul: returnează noul sfârșit, iar ștergerea reală se face cu erase.

Pentru a elimina toate duplicatele dintr-un vector, sortezi întâi (ca valorile egale să ajungă vecine), apoi aplici unique + erase.

Parametri

Parametru Descriere
first, last Intervalul.
egal Opțional. Funcție care spune când două elemente vecine sunt considerate egale.

Ce returnează

Iterator către noul sfârșit logic.

Exemple

Exemplul 1: Doar duplicatele consecutive

Al doilea 1 de la final rămâne, pentru că nu este lângă primul grup.

#include <algorithm>
#include <print>
#include <vector>

int main() {
    std::vector<int> v{1, 1, 2, 2, 2, 3, 1};
    v.erase(std::unique(v.begin(), v.end()), v.end());
    std::println("{}", v);
}

Rezultat

[1, 2, 3, 1]

Exemplul 2: Toate valorile distincte: sort + unique + erase

#include <algorithm>
#include <print>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> orase{"Iași", "Cluj", "Iași", "Arad", "Cluj", "Iași"};

    std::ranges::sort(orase);
    auto duplicate = std::ranges::unique(orase);
    orase.erase(duplicate.begin(), duplicate.end());

    std::println("{}", orase);
}

Rezultat

["Arad", "Cluj", "Iași"]

Exemplul 3: Spații multiple reduse la unul

#include <algorithm>
#include <print>
#include <string>

int main() {
    std::string text = "Ana   are    mere";

    auto sfarsit = std::unique(text.begin(), text.end(), [](char a, char b) { return a == ' ' && b == ' '; });
    text.erase(sfarsit, text.end());
    std::println("{}", text);
}

Rezultat

Ana are mere

Greșeli frecvente

  • Aplici unique pe un vector nesortat și te aștepți să dispară toate duplicatele. Dispar doar cele consecutive.
  • Uiți erase; dimensiunea vectorului rămâne aceeași.

Comenzi înrudite

  • std::sort: Sortează elementele dintr-un interval, crescător sau după o regulă dată de tine.
  • std::remove: Mută la final elementele egale cu o valoare și returnează noul sfârșit; ștergerea reală se face cu erase.
  • std::adjacent_find: Găsește prima pereche de elemente vecine egale (sau care îndeplinesc o condiție între ele).