C++ Academy · Lektion

std::unordered_map

Hurtigt hashbaseret opslag

Lektion 1 af 413 trin

std::unordered_map er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad er unordered_map

std::unordered_map gemmer nøgle-værdi-par i en hashtabel. Opslag, indsættelse og sletning tager konstant tid i gennemsnit, men elementerne har ingen sorteret rækkefølge.

#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 kontra unordered_map

Vælg ud fra dine behov:

  • map: sorteret, operationer i O(log n).
  • unordered_map: usorteret, operationer i O(1) i gennemsnit.

Brug unordered_map, når du kun har brug for hurtige opslag.

#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;
}

Indsættelse og opdatering

Samme API som map: brug [], insert() eller 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;
}

Opslag med find

find() returnerer en iterator eller end(). Det forhindrer utilsigtet indsættelse af en standardværdi, som [] ellers ville gøre.

#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;
}

Kontrol af eksistens

count() returnerer 0 eller 1, og C++20 tilføjer contains() til en tydelig boolesk kontrol.

#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;
}

Gennemløb

Du kan gennemløbe elementerne, men rækkefølgen er uspecificeret. Stol aldrig på, at den er sorteret eller følger indsættelsesrækkefølgen.

#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;
}

Sletning

erase() fjerner efter nøgle og returnerer antallet af fjernede elementer.

#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;
}

Hurtig optælling af frekvenser

For store datasæt, hvor rækkefølgen er ligegyldig, tæller unordered_map frekvenser hurtigere end 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;
}

Brug af at()

at() returnerer en reference og kaster std::out_of_range, hvis en nøgle mangler. Den indsætter aldrig noget.

#include <iostream>
#include <unordered_map>

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

Standardindsættelse via []

Hvis du tilgår en manglende nøgle med [], indsættes den med en værdinitialiseret værdi (0 for int). Vær forsigtig: Det udvider map uden at give besked.

#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;
}

Tømning af map

clear() tømmer tabellen, og empty() angiver, om den ikke indeholder nogen elementer.

#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;
}

Hurtig test

Test din forståelse af rækkefølgen i unordered_map.

Opsummering

Du har lært, at std::unordered_map:

  • bruger en hashtabel til operationer i O(1) i gennemsnit
  • har ingen garanteret rækkefølge
  • har samme API som map (find, count, at, erase)

Dernæst ser du unordered_set til hurtig lagring af unikke elementer.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “std::unordered_map” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “std::unordered_map”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “std::unordered_map”?

Hurtigt hashbaseret opslag Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “std::unordered_map”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. std::unordered_map
  2. unordered_set
  3. Brugerdefinerede hashfunktioner
  4. Ydelsesovervejelser
← Tilbage til C++ Academy