0Pricing
C++ Academy · Lekcja

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.

Wszystkie lekcje w tym kursie

  1. std::unordered_map
  2. unordered_set
  3. Niestandardowe funkcje haszujące
  4. Kwestie wydajności
← Powrót do C++ Academy