0Pricing
C++ Academy · Lekcja

std::unordered_map

Szybkie wyszukiwanie oparte na haszowaniu

std::unordered_map to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 1 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_map?

std::unordered_map przechowuje pary klucz–wartość w tablicy haszującej. Wyszukiwanie, wstawianie i usuwanie mają średnio stałą złożoność czasową, ale elementy nie mają posortowanej kolejności.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> ages;
    ages["Alice"] = 30;
    ages["Bob"] = 25;
    std::cout << ages["Alice"] << '\n';
    return 0;
}

map a unordered_map

Wybór zależy od potrzeb:

  • map: elementy posortowane, operacje O(log n).
  • unordered_map: elementy nieuporządkowane, operacje o średniej złożoności O(1).

unordered_map należy używać wtedy, gdy potrzebne jest tylko szybkie wyszukiwanie.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, std::string> m{{3, "c"}, {1, "a"}, {2, "b"}};
    std::cout << m.size() << " entries (order not guaranteed)\n";
    return 0;
}

Wstawianie i aktualizowanie

Ten sam interfejs API co w map: można używać [], insert() lub emplace().

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m;
    m["x"] = 1;
    m.insert({"y", 2});
    m.emplace("z", 3);
    std::cout << m.size() << '\n';
    return 0;
}

Wyszukiwanie za pomocą find

find() zwraca iterator albo end(). Pozwala to uniknąć przypadkowego wstawienia wartości domyślnej, do którego doszłoby przy użyciu [].

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}};
    auto it = m.find("a");
    if (it != m.end()) std::cout << it->second << '\n';
    std::cout << "size: " << m.size() << '\n';
    return 0;
}

Sprawdzanie istnienia

count() zwraca 0 albo 1, a C++20 dodaje contains() do przejrzystego sprawdzania wartości logicznej.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"key", 99}};
    std::cout << m.count("key") << '\n';
    std::cout << m.count("missing") << '\n';
    return 0;
}

Iterowanie

Można iterować po elementach, ale kolejność jest nieokreślona. Nie należy nigdy zakładać, że elementy są posortowane ani uporządkowane według kolejności wstawiania.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
    int total = 0;
    for (const auto& [k, v] : m) total += v;
    std::cout << "sum = " << total << '\n';
    return 0;
}

Usuwanie

erase() usuwa elementy według klucza i zwraca ich liczbę.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}};
    m.erase("a");
    std::cout << m.count("a") << ' ' << m.size() << '\n';
    return 0;
}

Szybkie zliczanie częstości

W przypadku dużych zbiorów danych, gdy kolejność nie ma znaczenia, unordered_map zlicza częstości szybciej niż map.

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
    std::string items[] = {"a", "b", "a", "c", "b", "a"};
    std::unordered_map<std::string, int> freq;
    for (const auto& s : items) freq[s]++;
    std::cout << "a appears " << freq["a"] << " times\n";
    return 0;
}

Używanie at()

at() zwraca referencję i zgłasza wyjątek std::out_of_range dla brakującego klucza, nigdy go nie wstawiając.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"score", 42}};
    std::cout << m.at("score") << '\n';
    return 0;
}

Domyślne wstawianie za pomocą []

Uzyskanie dostępu do brakującego klucza za pomocą [] wstawia go wraz z wartością zainicjalizowaną domyślnie (dla typów całkowitych jest to 0). Należy zachować ostrożność, ponieważ mapa zostaje w ten sposób po cichu powiększona.

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m;
    std::cout << m["new"] << '\n';
    std::cout << "size: " << m.size() << '\n';
    return 0;
}

Czyszczenie mapy

clear() opróżnia tablicę, a empty() informuje, czy nie zawiera ona żadnych elementów.

#include <iostream>
#include <unordered_map>

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

Szybkie sprawdzenie

Proszę sprawdzić swoje zrozumienie kolejności elementów w unordered_map.

Podsumowanie

Dowiedzieli się Państwo, że std::unordered_map:

  • używa tablicy haszującej do wykonywania operacji o średniej złożoności O(1)
  • nie ma gwarantowanej kolejności
  • udostępnia ten sam interfejs API co map (find, count, at, erase)

Następnie poznają Państwo unordered_set do szybkiego przechowywania unikalnych elementów.

Często zadawane pytania

Czy lekcja „std::unordered_map” jest bezpłatna?

Tak — pełny tekst „std::unordered_map” 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 „std::unordered_map”?

Szybkie wyszukiwanie 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 1 z 4.

Ile czasu zajmuje lekcja „std::unordered_map”?

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