Qual è la differenza tra std :: multimap <key, value> e std :: map <key, std :: set <value>>


Risposte:


52

La multimappa memorizza coppie di (chiave, valore) in cui sia la chiave che il valore possono apparire più volte.

L' map<key, set<value>>sarà memorizzare solo ogni valore una volta per un tasto specifico. Per fare ciò, dovrà essere in grado di confrontare i valori, non solo le chiavi.

Dipende dalla tua applicazione se i valori che si confrontano sono equivalenti o se desideri comunque memorizzarli separatamente. Forse contengono campi diversi ma non prendono parte al confronto per l'insieme.


5
Quindi, uno std :: multimap <chiave, valore> è come uno std :: map <chiave, std :: multiset <valore>>, la differenza tra loro è che i valori successivi sono ordinati. È giusto?
大 宝剑

2
No, std::multimap<key, value>consente alla stessa chiave di apparire più volte mentre std::map<key, whatever>richiede l'unicità di key.
Yixing Liu

75

A std::mapè un contenitore associativo, che ti consente di avere una chiave univoca associata al valore del tuo tipo. Per esempio,

void someFunction()
{
    typedef std::map<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    auto it = myMap.find("test");
    if (it != myMap.end())
        std::cout << "value for " << it->first << " is " << it->second << std::endl;
    else
        std::cout << "value not found" << std::endl;
}

A std::multimapè uguale a a std::map, ma le tue chiavi non sono più uniche. Pertanto puoi trovare una gamma di articoli invece di trovare solo un oggetto unico. Per esempio,

void someFunction()
{
    typedef std::multimap<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("test", 45));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    std::pair<auto first, auto second> range = myMap.equal_range("test");
    for (auto it = range.first; it != range.second; ++it)
        std::cout << "value for " << it->first << " can be " << it->second << std::endl;
}

L' std::setè come unstd::map , ma non sta memorizzando un tasto associato a un valore. Memorizza solo il tipo di chiave e ti assicura che è univoco all'interno del set.

Hai anche il std::multiset, che segue lo stesso schema.

Tutti questi contenitori forniscono un accesso O (log (n)) con il loro find / equal_range.


6
Nella funzione multimap, questa riga std::pair<auto first, auto second> range = myMap.equal_range("test");non funziona, perché error: 'auto' not allowed in template argument. Usa const auto range = myMap.equal_range("test")invece.
vancexu

2
tipo di mappa? Non dovrebbe essere MapType sulla riga 4?
lolololol del

non sono sicuro di chi sia stato il primo, ma uno è ovviamente un copia incolla dell'altro: cppbuzz.com/What-is-difference-between-map-and-multimap
grande_prime_is_463035818

1
ahah, cppbuzz sta raschiando StackOverflow o cosa ?, Ho scritto questa risposta da solo anni fa, quando stavo ancora programmando quotidianamente in c ++. E c'è davvero un errore di battitura 4, grazie @lololololol
typedef

1
(e il loro copia / incolla non è riuscito, non visualizzano nemmeno i tipi nella dichiarazione std del modello :: map: std :: map <std :: string, int>)
typedef

13
map::insert

Poiché i mapcontenitori non consentono valori di chiave duplicati, l'operazione di inserimento verifica per ogni elemento inserito se esiste già un altro elemento nel contenitore con lo stesso valore di chiave, in tal caso l'elemento non viene inserito e il suo valore mappato non viene modificato in alcun modo.

d'altra parte

multimap::insert 

può inserire un numero qualsiasi di elementi con la stessa chiave.

http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/


Buon collegamento sia sulla differenza che su come funziona internamente. link
Rndp13

10

Quest'ultimo richiede che i valori possano essere ordinati (tramite operator<o una funzione di confronto), il primo no.


Sembrerebbe che l'operatore <funzioni allo stesso modo su mappa o multimappa? en.cppreference.com/w/cpp/container/map/operator_cmp
johnbakers

Sì, ma la mia risposta si riferiva all'ordinamento dei valori. Supponi di avere un tipo Tche non ha alcun ordine. Puoi usarlo per creare un file std::multimap<U, T>, ma non puoi usarlo per creare un file std::map<U, std::set<T> >.
Björn Pollex
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.