std::unordered_multimap în C++

Tabelă hash care permite aceeași cheie de mai multe ori; elementele nu au o ordine anume.

Sintaxă
#include <unordered_map>

std::unordered_multimap<Cheie, Valoare> nume;

Ce face std::unordered_multimap

std::unordered_multimap combină ideea de std::multimap (chei repetate) cu tabela hash a lui std::unordered_map. Nu are operator[] și nici at. Valorile unei chei se obțin cu equal_range(cheie); elementele cu aceeași cheie sunt alăturate, dar ordinea lor (și ordinea cheilor) nu este garantată.

Parametri

Parametru Descriere
Cheie, Valoare Ca la std::unordered_map.

Ce returnează

Un obiect unordered_multimap.

Exemple

Exemplul 1: Numerele de telefon ale unei persoane

Ordinea valorilor pentru aceeași cheie nu este garantată, așa că le sortăm înainte de afișare.

#include <algorithm>
#include <print>
#include <string>
#include <unordered_map>
#include <vector>

int main() {
    std::unordered_multimap<std::string, std::string> telefoane{
        {"Ana", "0722 111 222"}, {"Ion", "0744 333 444"}, {"Ana", "0232 555 666"},
    };
    std::println("Ana are {} numere", telefoane.count("Ana"));

    auto [prim, ultim] = telefoane.equal_range("Ana");
    std::vector<std::string> numere;
    for (auto it = prim; it != ultim; ++it) {
        numere.push_back(it->second);
    }
    std::ranges::sort(numere);
    std::println("{}", numere);
}

Rezultat

Ana are 2 numere
["0232 555 666", "0722 111 222"]

Greșeli frecvente

  • Presupui că valorile unei chei ies în ordinea în care le-ai adăugat. Ordinea depinde de implementare.

Comenzi înrudite

  • std::unordered_map: Dicționar bazat pe tabelă hash: căutare în timp mediu constant, dar fără o ordine anume a elementelor.
  • std::multimap: Ca std::map, dar aceeași cheie poate apărea de mai multe ori, cu valori diferite.