C++ Academy · leksjon

std::unordered_map

Rask hashbasert oppslag

Leksjon 1 av 413 trinn

std::unordered_map er en gratis leksjon i C++ Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C++ Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hva er unordered_map?

std::unordered_map lagrer nøkkel-verdi-par i en hash-tabell. Oppslag, innsetting og sletting tar konstant tid i gjennomsnitt, men elementene har ingen sortert rekkefø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 vs. unordered_map

Velg ut fra behovene:

  • map: sortert, operasjoner i O(log n).
  • unordered_map: usortert, operasjoner i O(1) i gjennomsnitt.

Bruk unordered_map når du bare trenger raske oppslag.

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

Sette inn og oppdatere

Samme API som map: bruk [], 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;
}

Oppslag med find

find() returnerer en iterator eller end(). Dette hindrer utilsiktet innsetting av en standardverdi slik [] ville gjort.

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

Kontrollere om en verdi finnes

count() returnerer 0 eller 1, og C++20 introduserer contains() for en tydelig boolsk kontroll.

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

Iterering

Du kan iterere, men rekkefølgen er uspesifisert. Stol aldri på at den er sortert eller følger innsettingsrekkefø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;
}

Slette

erase() sletter etter nøkkel og returnerer antallet elementer som ble slettet.

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

Rask frekvenstelling

For store datasett der rekkefølgen ikke spiller noen rolle, teller unordered_map frekvenser raskere enn 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;
}

Bruke at()

at() returnerer en referanse og kaster std::out_of_range hvis en nøkkel mangler, uten å sette inn noe.

#include <iostream>
#include <unordered_map>

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

Standardinnsetting via []

Hvis du bruker [] på en manglende nøkkel, settes den inn med en verdibasert initialisert verdi (0 for int). Vær forsiktig: Beholderen vokser i stillhet.

#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ømme beholderen

clear() tømmer tabellen, og empty() angir om den ikke inneholder noen 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;
}

Rask sjekk

Test forståelsen din av rekkefølgen i unordered_map.

Oppsummering

Du har lært at std::unordered_map:

  • bruker en hash-tabell for operasjoner i O(1) i gjennomsnitt
  • ikke har noen garantert rekkefølge
  • har samme API som map (find, count, at, erase)

Deretter skal du se på unordered_set for rask lagring av unike elementer.

Gratis å komme i gang

Lær deg C++ med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «std::unordered_map» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «std::unordered_map», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «std::unordered_map»?

Rask hashbasert oppslag Du øver på C++ Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C++ Academy?

Ingen tidligere erfaring er nødvendig. C++ Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «std::unordered_map»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C++ Academy-leksjonen?

Ja. Alle C++ Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. std::unordered_map
  2. unordered_set
  3. Egendefinerte hashfunksjoner
  4. Ytelsesvurderinger
← Tilbake til C++ Academy