C++ Academy · Lektion

unordered_set

Hashbaserede unikke elementer

Lektion 2 af 413 trin

unordered_set er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 2 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_set

std::unordered_set gemmer unikke elementer i en hashtabel. Test af medlemskab tager konstant tid i gennemsnit, men der er ingen sorteret rækkefølge.

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

Som for map-typer:

  • set: sorteret, O(log n).
  • unordered_set: usorteret, O(1) i gennemsnit.

Vælg unordered_set for de hurtigst mulige medlemskabstests.

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

Indsættelse af værdier

insert() tilføjer et element, ignorerer det, hvis det allerede findes, og returnerer et par, hvis .second angiver, om elementet blev tilføjet.

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

Hurtige medlemskabstests

Det klassiske anvendelsesområde er at kontrollere, om du har set en værdi før. count() returnerer 0 eller 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;
}

Sletning af elementer

erase() fjerner en værdi og returnerer, hvor mange der blev fjernet (0 eller 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;
}

Registrering af dubletter

Du kan finde den første dublet i en datastrøm ved at indsætte værdien og kontrollere det booleske resultat.

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

Gennemløb

Gennemløb fungerer, men rækkefølgen er uspecificeret. Summér eller behandl elementer uden at antage en bestemt rækkefølge.

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

Fjernelse af dubletter fra et interval

Opret en unordered_set ud fra et interval for hurtigt at fjerne dubletter (rækkefølgen bevares ikke).

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

find() giver dig en iterator til elementet, så du kan arbejde videre med det, mens count() kun angiver, om det findes.

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

Tømning og tomhed

clear() fjerner alle elementer, og empty() kontrollerer, om der ikke er nogen.

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

Snit mellem sæt

Hvis du vil finde fælles elementer, skal du gennemløbe det ene sæt og kontrollere medlemskab i det andet.

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

Hurtig test

Test din forståelse af unordered_set.

Opsummering

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

  • gemmer unikke elementer med operationer i O(1) i gennemsnit
  • har ingen garanteret rækkefølge
  • er ideel til hurtige medlemskabstests og registrering af dubletter

Dernæst lærer du at hashe dine egne brugerdefinerede typer.

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 “unordered_set” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “unordered_set”, 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 “unordered_set”?

Hashbaserede unikke elementer 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 2 af 4.

Hvor lang tid tager lektionen “unordered_set”?

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