unordered_set
Unikatowe elementy oparte na haszowaniu
unordered_set to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Czym jest unordered_set?
std::unordered_set przechowuje unikalne elementy w tablicy haszującej. Sprawdzanie przynależności ma średnio stałą złożoność czasową, ale elementy nie mają posortowanej kolejności.
#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 a unordered_set
Podobnie jak w przypadku map:
set: elementy posortowane, O(log n).unordered_set: elementy nieuporządkowane, średnio O(1).
unordered_set należy wybrać, gdy najważniejsze jest najszybsze sprawdzanie przynależności.
#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;
}Wstawianie wartości
insert() dodaje element, pomijając go, jeśli już istnieje, i zwraca parę, której .second informuje, czy element został dodany.
#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;
}Szybkie sprawdzanie przynależności
Sprawdzanie, czy dana wartość już wystąpiła, to klasyczny przypadek użycia. count() zwraca 0 albo 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;
}Usuwanie elementów
erase() usuwa wartość i zwraca liczbę usuniętych elementów (0 albo 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;
}Wykrywanie duplikatów
Można wykryć pierwszy duplikat w strumieniu, wstawiając element i sprawdzając wynik logiczny.
#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;
}Iterowanie
Iterowanie działa, ale kolejność jest nieokreślona. Należy sumować lub przetwarzać elementy bez zakładania jakiejkolwiek kolejności.
#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;
}Usuwanie duplikatów z zakresu
Należy utworzyć unordered_set z zakresu, aby szybko usunąć duplikaty (kolejność nie zostanie zachowana).
#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 a count
find() udostępnia iterator wskazujący element, dzięki czemu można go dalej używać, natomiast count() jedynie informuje o jego obecności.
#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;
}Czyszczenie i sprawdzanie pustki
clear() usuwa wszystkie elementy, a empty() sprawdza, czy nie ma żadnego.
#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;
}Część wspólna zbiorów
Aby znaleźć wspólne elementy, należy przejść po jednym zbiorze i sprawdzić ich przynależność do drugiego.
#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;
}Szybkie sprawdzenie
Proszę sprawdzić swoje zrozumienie unordered_set.
Podsumowanie
Dowiedzieli się Państwo, że std::unordered_set:
- przechowuje unikalne elementy, wykonując operacje o średniej złożoności O(1)
- nie ma gwarantowanej kolejności
- doskonale nadaje się do szybkiego sprawdzania przynależności i wykrywania duplikatów
Następnie nauczą się Państwo haszować własne typy.
Często zadawane pytania
Czy lekcja „unordered_set” jest bezpłatna?
Tak — pełny tekst „unordered_set” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „unordered_set”?
Unikatowe elementy oparte na haszowaniu Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „unordered_set”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.