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?
Vous venez de faire (pour map
et unordered_map
)
mydict[key]=value;
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.
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
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
}