std::unique (tsz. std::uniques)
std::unique
a C++ STL egyik hasznos algoritmusa, amely eltávolítja a szomszédos ismétlődő (duplikált) elemeket egy tartományból.👉 Fontos: csak az egymás melletti (szomszédos) duplikátumokat távolítja el! Ha a duplikátumok nem szomszédosak → először rendezni kell.
auto new_end = std::unique(first, last);
first
, last
→ a tartomány kezdete és vége (iterátorok).
erase()
-t.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 8};
auto new_end = std::unique(numbers.begin(), numbers.end());
numbers.erase(new_end, numbers.end());
std::cout << "Egyedi elemek: ";
for (int num : numbers) {
std::cout << num << " ";
}
return 0;
}
Egyedi elemek: 1 2 3 4 5 8
std::unique
eltávolította az egymás melletti ismétlődéseket.erase()
utasítás valóban kitörölte a felesleges elemeket → így a vector
tényleges mérete is csökkent.
Ha a tartomány nem rendezett, a std::unique
nem fogja eltávolítani a nem szomszédos duplikátumokat:
std::vector<int> numbers = {5, 2, 8, 5, 3, 2, 4, 1, 4, 3};
auto new_end = std::unique(numbers.begin(), numbers.end());
numbers.erase(new_end, numbers.end());
Kimenet: nem feltétlenül egyedi → előtte célszerű rendezni:
std::sort(numbers.begin(), numbers.end());
auto new_end = std::unique(numbers.begin(), numbers.end());
numbers.erase(new_end, numbers.end());
Így lesz valóban globálisan egyedi.
✅ Duplikátumok eltávolítása ha a tartomány már rendezett. ✅ Ha globális duplikátumokat akarsz eltávolítani → előtte std::sort
. ✅ Gyors, mert lineáris időben működik: O(n).
Tulajdonság | Részlet |
---|---|
Algoritmus neve | std::unique
|
Mit csinál | Eltávolítja a szomszédos duplikátumokat |
Bemenet | Tartomány (általában rendezett) |
Kimenet | Új “vége” iterátor (a duplikátumok “hátraszorulnak”) |
Valódi törlés | Külön erase() hívással
|
Időkomplexitás | O(n) |
Megőrzi sorrendet | Igen, az első előfordulást tartja meg |
std::sort(v.begin(), v.end());
auto new_end = std::unique(v.begin(), v.end());
v.erase(new_end, v.end());
std::unique
→ szomszédos duplikátumokat távolít el.std::sort
.erase()
-t külön kell meghívni.