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
uniquepe 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).