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
- std::unordered_map
- unordered_set
- Niestandardowe funkcje haszujące
- Kwestie wydajności