unordered_map example c++ performance unordered-map

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.



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;