2013-10-05 3 views
24

Im Moment habe ich eine Menge Code, der wie folgt aussieht:Was ist der schnellste Weg zum Einfügen/Aktualisieren von std :: unordered_map Elementen ohne ein 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)); 
} 

Gibt es eine Möglichkeit, diese nach oben beschleunigen kann, indem einfach jedes Mal den Wert zu überschreiben?

+0

Sieht aus wie Sie Karte – billz

+0

@billz Ich möchte O (1) Einfügezeitpunkt verwenden sollte? Ich will keinen Baum O log (N) – user997112

+2

der [] tut dies. http://www.cplusplus.com/reference/unordered_map/unordered_map/operator[]/ Natürlich muss die Komplexität linear sein. Wenn Sie weniger Zeit zum Einfügen benötigen, verwenden Sie eine Karte – janoliver

Antwort

35

Sie tun nur (für map und unordered_map)

mydict[key]=value; 
+0

mit 'if-else' wäre schneller und nur dann, wenn die Default-Konstruktion von' value' sehr teuer ist. In den meisten Fällen erledigt 'operator []' die Aufgabe. – letsBeePolite

13

ich denke, es könnte am schnellsten so aussehen:

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

auf diese Weise Sie nicht die Struktur des unordered_map ändern, wenn die key bereits vorhanden ist und Sie nur einen Nachschlag haben.


Eine weitere Option, falls Sie nicht/Zugang brauchen value danach:

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

Dies könnte in Fällen besser sein, wenn die Zuordnung von value von move-Semantik teuer und Nutzen ist.

+1

Warum, wenn 'operator []' genau das schon tut? – us2012

+3

@ us2012 Meistens, aber im Insert-Fall fügt es zuerst einen standardkonstruierten Wert ein und weist ihn dann zu. Das oben genannte vermeidet diesen Overhead. –

+3

Ich würde einige ernsthafte Messungen des einfachen Falls machen ('foo [key] = value;'), bevor ich diesen Weg gehe. – Joe