unordered_set
Hajautuspohjaiset yksikäsitteiset alkiot
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.
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.