std::unique
Megjelenés
Főnév
std::unique (tsz. std::uniques)
- (informatika) A
std::uniquea 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.
🕹️ Szintaxis
auto new_end = std::unique(first, last);
first,last→ a tartomány kezdete és vége (iterátorok).- Visszatérési érték: egy iterátor, amely a “megmaradt” egyedi tartomány vége utáni pozícióra mutat.
⚙️ Hogyan működik?
- Bejárja a tartományt.
- Megőrzi az első előfordulást minden elemből.
- Ha a következő elem egyenlő az előzővel → kihagyja.
- Nem törli az elemeket → a tartomány elején összetolja az egyedi elemeket, a “felesleges” duplikátumokat a végére helyezi.
- A tényleges törléshez külön kell hívni
erase()-t.
📝 Példa
#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;
}
Kimenet:
Egyedi elemek: 1 2 3 4 5 8
Mi történt?
- A
std::uniqueeltávolította az egymás melletti ismétlődéseket. - A
erase()utasítás valóban kitörölte a felesleges elemeket → így avectortényleges mérete is csökkent.
Nem rendezett tartománnyal
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.
Amire jó:
✅ 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).
Fontos megjegyzések
| 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 |
Használati minta globális egyedivé tételhez:
std::sort(v.begin(), v.end());
auto new_end = std::unique(v.begin(), v.end());
v.erase(new_end, v.end());
Összefoglalás
std::unique→ szomszédos duplikátumokat távolít el.- Ha globális duplikátumokat akarsz eltávolítani → előbb
std::sort. - Nem törli az elemeket →
erase()-t külön kell meghívni.
- std::unique - Szótár.net (en-hu)
- std::unique - Sztaki (en-hu)
- std::unique - Merriam–Webster
- std::unique - Cambridge
- std::unique - WordNet
- std::unique - Яндекс (en-ru)
- std::unique - Google (en-hu)
- std::unique - Wikidata
- std::unique - Wikipédia (angol)