Ugrás a tartalomhoz

std::unique

A Wikiszótárból, a nyitott szótárból


Főnév

std::unique (tsz. std::uniques)

  1. (informatika) A 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.



🕹️ 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::unique eltávolította az egymás melletti ismétlődéseket.
  • A erase() utasítás valóban kitörölte a felesleges elemeket → így a vector té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::uniqueszomszé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.