Ho letto molto su unordered_map(C++ 11)tempo la complessità qui a StackOverflow, ma non ho trovato la risposta per la mia domanda.C++ std :: complessità unordered_map
Supponiamo indicizzazione per intero (solo per esempio):
Inserire/a funzioni lavorano costantemente (in tempo medio), quindi questo esempio potrebbe prendere O (1)
std::unordered_map<int, int> mymap = {
{ 1, 1},
{ 100, 2},
{ 100000, 3 }
};
Quello che ho Sono curioso di sapere quanto tempo ci vuole per scorrere tutti i valori (non ordinati) memorizzati nella mappa - ad es
for (auto it = mymap.begin(); it != mymap.end(); ++it) { ... }
Posso supporre che ogni valore memorizzato si accede solo una volta (o due o costante volte)? Ciò implicherebbe che iterare attraverso tutti i valori sia nella mappa O a valore N (N). L'altra possibilità è che il mio esempio con le chiavi {1,10,1000000} potrebbe richiedere fino a 1000000 iterazione (se rappresentato dall'array)
C'è un altro contenitore, che può essere iterato linearmente e il valore accessibile costantemente da una determinata chiave ?
Quello che mi ha realmente bisogno è (pseudocodice)
myStructure.add(key, value) // O(1)
value = myStructure.at(key) // O(1)
for (auto key : mySructure) {...} // O(1) for each key/value pair = O(N) for N values
È std :: unordered_map la struttura ho bisogno?
L'indicizzazione di numeri interi è sufficiente, anche la complessità media.
Se sei preoccupato che l'enumerazione richieda di superare gli abbinamenti che * non * hai inserito nel tuo contenitore, ti assicuriamo che non lo farà. La decisione di utilizzare un normale 'map' vs' unordered_map' dovrebbe essere basata sul fatto che sia necessario un ordine relativamente rigoroso delle chiavi * mantenuto *. Se lo fai, hai bisogno di una normale 'mappa'. In caso contrario, 'unordered_map' è la scelta più logica (a condizione che le chiavi possano essere sottoposte a hashing con una distribuzione ragionevole). – WhozCraig
@WhozCraig: un altro fattore funzionale da considerare quando si sceglie 'map' o' unordered_map' è se l'invalidazione di iteratori/riferimenti/puntatori esistenti durante 'insert' /' emplace'/'[]' l'attivazione del rehashing è accettabile, quindi Sono le differenze di prestazioni che * tendono * ad essere nel favore di 'unordered_map', ma dovrebbero essere misurate da coloro i cui profiler/strumenti dicono che devono davvero preoccuparsi .... –