web-dev-qa-db-fra.com

Quel est le moyen le plus rapide d’insérer/mettre à jour des éléments std :: unordered_map sans utiliser un if?

J'ai actuellement beaucoup de code qui ressemble à ceci:

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));
}

Est-il possible d'accélérer ce processus en écrasant simplement la valeur à chaque fois?

31
user997112

Vous venez de faire (pour map et unordered_map)

mydict[key]=value;
44
Joe

Je pense que ça pourrait être le plus rapide comme ça:

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

de cette façon, vous ne modifiez pas la structure du unordered_map si le key existe déjà et vous n'avez qu'une recherche.


Une autre option si vous n'avez pas besoin de/accès value après:

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

Cela pourrait être mieux dans les cas où l'attribution de value est coûteuse et profite de la sémantique du déplacement.

16
Daniel Frey

Pour mettre à jour pour C++ 17, vous pouvez utiliser:

std::unordered_map::insert_or_assign()

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

3
htmlboss

En général, vous évitez les saisies supplémentaires en définissant une fonction qui vous évite de saisir à nouveau la même chose ... Si vous n'avez pas accès à la fonction insert_or_assign() de C++ 17, vous pouvez implémenter vous-même quelque chose comme ceci:

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