c++ - example - ¿Cuál es la forma más rápida de insertar/actualizar elementos std:: unordered_map sin usar if?
unordered_map c++ (4)
Actualmente tengo un montón de código que se parece a esto:
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));
}
¿Hay alguna manera en que pueda acelerar esto simplemente sobrescribiendo el valor cada vez?
Creo que podría ser más rápido así:
auto it = my_dict.find(key);
if( it != my_dict.end() ) {
*it = value;
}
else {
my_dict.insert(std::make_pair(key,value));
}
de esa manera no modificará la estructura del unordered_map
si la key
ya existe y solo tiene una búsqueda.
Otra opción en caso de que no necesite / acceda al value
después:
my_dict[key] = std::move(value);
Esto podría ser mejor en los casos en que la asignación de value
es costosa y se beneficia de la semántica de movimientos.
Para actualizar para C ++ 17, puedes usar:
std::unordered_map::insert_or_assign()
http://en.cppreference.com/w/cpp/container/unordered_map/insert_or_assign
Por lo general, evita la escritura adicional mediante la definición de una función que evita que vuelva a escribir lo mismo. Si no tiene acceso a insert_or_assign()
C ++ 17, puede implementar algo como esto:
bool InsertOrAssign(std::unordered_map& m, int key, int value) {
// Your code or one of the suggested answers goes here
}
Simplemente hazlo (para map
y unordered_map
)
mydict[key]=value;