2013-10-05 13 views
24

Al momento ho un sacco di codice che assomiglia a questo:Qual è il modo più rapido per inserire/aggiornare gli elementi std :: unordered_map senza usare if?

std::unordered_map<int,int> my_dict; 
. 
. 
. 
// If the key does exist in the dictionary 
if(my_dict.count(key) == 1){ 
    my_dict[key] = value; 
} 

// If its a new key 
else{ 
    my_dict.insert(std::make_pair(key,value)); 
} 

C'è un modo per accelerare questo semplicemente sovrascrivendo il valore ogni volta?

+0

Sembra che si dovrebbe usare la mappa – billz

+0

@billz voglio O (1) tempo di inserimento? Non voglio un albero O log (N) – user997112

+2

il [] fa questo. http://www.cplusplus.com/reference/unordered_map/unordered_map/operator[]/ Naturalmente, la complessità deve essere lineare. Se si desidera meno tempo di inserimento, utilizzare una mappa – janoliver

risposta

35

Devi solo fare (per map e unordered_map)

mydict[key]=value; 
+0

usando 'if-else' sarebbe più veloce se e solo se la costruzione predefinita di' valore' è molto costosa. Sebbene, nella maggior parte dei casi, "operator []" svolga il lavoro. – letsBeePolite

13

penso che potrebbe essere più veloce in questo modo:

auto it = my_dict.find(key); 
if(it != my_dict.end()) { 
    *it = value; 
} 
else { 
    my_dict.insert(std::make_pair(key,value)); 
} 

in questo modo di non modificare la struttura del unordered_map se il key già esiste e si dispone di una sola occhiata.


Un'altra opzione nel caso in cui non è necessario/accesso value seguito:

my_dict[key] = std::move(value); 

Questo potrebbe essere meglio nei casi in cui l'assegnazione di value è costoso e beneficia di spostare-semantica.

+1

Perché farlo se 'operator []' fa esattamente questo? – us2012

+3

@ us2012 Principalmente, ma nel caso di inserimento, prima inserisce un valore predefinito costruito, quindi lo assegna. Quanto sopra evita quel sovraccarico. –

+3

Farei una misura seria del caso semplice ('foo [chiave] = valore;') prima di percorrere questa rotta. – Joe

Problemi correlati