C++ Academy · Oppitunti

unordered_set

Hajautuspohjaiset yksikäsitteiset alkiot

Oppitunti 2/413 vaihetta

unordered_set on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mikä on unordered_set

std::unordered_set tallentaa yksilölliset alkiot hajautustauluun. Jäsenyyden tarkistaminen on keskimäärin vakioaikaista, mutta alkiot eivät ole järjestyksessä.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{1, 2, 3, 2, 1};
    std::cout << s.size() << " unique values\n";
    return 0;
}

set ja unordered_set

Kuten map-säilöissä:

  • set: järjestetty, O(log n).
  • unordered_set: järjestämätön, keskimäärin O(1).

Valitkaa unordered_set nopeimpiin jäsenyystarkistuksiin.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> seen{"a", "b", "c"};
    std::cout << (seen.count("b") ? "yes" : "no") << '\n';
    return 0;
}

Arvojen lisääminen

insert() lisää alkion, ohittaa sen, jos se on jo olemassa, ja palauttaa parin, jonka .second-alkio ilmoittaa, lisättiinkö alkio.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s;
    auto a = s.insert(5);
    auto b = s.insert(5);
    std::cout << std::boolalpha << a.second << ' ' << b.second << '\n';
    return 0;
}

Nopeat jäsenyystarkistukset

Sen tarkistaminen, onko arvo nähty jo aiemmin, on tavanomainen käyttötapaus. count() palauttaa arvon 0 tai 1.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> blocked{"spam", "junk"};
    std::cout << blocked.count("spam") << '\n';
    std::cout << blocked.count("ok") << '\n';
    return 0;
}

Alkioiden poistaminen

erase() poistaa arvon ja palauttaa poistettujen alkioiden määrän (0 tai 1).

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{1, 2, 3};
    s.erase(2);
    std::cout << "count 2: " << s.count(2) << '\n';
    std::cout << "size: " << s.size() << '\n';
    return 0;
}

Duplikaattien tunnistaminen

Virran ensimmäisen duplikaatin voi tunnistaa lisäämällä alkion ja tarkistamalla totuusarvotuloksen.

#include <iostream>
#include <unordered_set>

int main() {
    int data[] = {3, 7, 1, 7, 9};
    std::unordered_set<int> seen;
    for (int x : data) {
        if (!seen.insert(x).second) {
            std::cout << "first duplicate: " << x << '\n';
            break;
        }
    }
    return 0;
}

Iterointi

Iterointi toimii, mutta järjestystä ei ole määritetty. Summatkaa tai käsitelkää alkiot olettamatta mitään tiettyä järjestystä.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{10, 20, 30};
    int total = 0;
    for (int x : s) total += x;
    std::cout << "sum = " << total << '\n';
    return 0;
}

Alueen duplikaattien poistaminen

Luokaa unordered_set- säilö alueesta, niin duplikaatit poistuvat nopeasti. Järjestys ei säily.

#include <iostream>
#include <unordered_set>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 2, 3, 3, 3};
    std::unordered_set<int> u(v.begin(), v.end());
    std::cout << u.size() << " unique\n";
    return 0;
}

find ja count

find() antaa iteraattorin alkioon, joten voitte käyttää sitä edelleen, kun taas count() ilmoittaa vain alkion olemassaolon.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> s{"alpha", "beta"};
    auto it = s.find("beta");
    std::cout << (it != s.end() ? *it : "none") << '\n';
    return 0;
}

Tyhjentäminen ja tyhjyyden tarkistaminen

clear() poistaa kaikki alkiot ja empty() tarkistaa, ettei alkioita ole.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{1, 2, 3};
    s.clear();
    std::cout << std::boolalpha << s.empty() << '\n';
    return 0;
}

Joukkojen leikkaus

Yhteisten alkioiden löytämiseksi käykää yksi joukko läpi ja tarkistakaa jäsenyys toisesta joukosta.

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> a{1, 2, 3, 4};
    std::unordered_set<int> b{3, 4, 5};
    for (int x : a) if (b.count(x)) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte unordered_set-säilöä.

Kertaus

Opitte, että std::unordered_set:

  • tallentaa yksilöllisiä alkioita keskimäärin O(1)-aikaisilla operaatioilla
  • ei takaa mitään tiettyä järjestystä
  • sopii erinomaisesti nopeisiin jäsenyystarkistuksiin ja duplikaattien tunnistamiseen

Seuraavaksi opitte hajauttamaan omia mukautettuja tyyppejänne.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”unordered_set” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “unordered_set”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”unordered_set”?

Hajautuspohjaiset yksikäsitteiset alkiot Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”unordered_set”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. std::unordered_map
  2. unordered_set
  3. Mukautetut hajautusfunktiot
  4. Suorituskykynäkökohdat
← Takaisin: C++ Academy