it-swarm.com.de

Was ist der schnellste Weg zum Einfügen/Aktualisieren von std :: unordered_map-Elementen ohne ein if?

Ich habe derzeit viel Code, der so aussieht:

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, dies zu beschleunigen, indem der Wert jedes Mal einfach überschrieben wird?

31
user997112

Sie tun einfach (für map und unordered_map)

mydict[key]=value;
44
Joe

Ich denke es könnte am schnellsten so sein:

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 ändern Sie die Struktur von unordered_map nicht, wenn die key bereits vorhanden ist und Sie nur eine Suche durchführen.


Eine weitere Option für den Fall, dass Sie danach nicht auf value zugreifen müssen:

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

Dies kann in Fällen besser sein, in denen die Zuweisung von value teuer ist und von der Umzugssemantik profitiert.

16
Daniel Frey

Zum Aktualisieren für C++ 17 können Sie Folgendes verwenden:

std::unordered_map::insert_or_assign()

http://en.cppreference.com/w/cpp/container/unordered_map/insert_or_assign

3
htmlboss

Normalerweise vermeiden Sie das zusätzliche Tippen, indem Sie eine Funktion definieren, mit der Sie nicht noch einmal dasselbe eingeben müssen .. Wenn Sie keinen Zugriff auf insert_or_assign() von C++ 17 haben, können Sie etwas selbst wie folgt implementieren:

bool InsertOrAssign(std::unordered_map& m, int key, int value) {
  // Your code or one of the suggested answers goes here
}
0
Serge Rogatch