std::unique

Üdvözlöm, Ön a std::unique szó jelentését keresi. A DICTIOUS-ban nem csak a std::unique szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a std::unique szót egyes és többes számban mondani. Minden, amit a std::unique szóról tudni kell, itt található. A std::unique szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Astd::unique és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

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.