Каков самый быстрый способ вставки / обновления элементов карты std::unordered без использования if?
в настоящее время у меня есть много кода, который выглядит так:
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));
}
есть ли способ ускорить это, просто перезаписывая значение каждый раз?
4 ответов
Я думаю, что это может быть быстрее всего, как это:
auto it = my_dict.find(key);
if( it != my_dict.end() ) {
*it = value;
}
else {
my_dict.insert(std::make_pair(key,value));
}
таким образом, вы не измените структуру unordered_map
Если key
уже существует и у вас есть только один поиск.
другой вариант в случае, если вам не нужен / access value
после:
my_dict[key] = std::move(value);
это может быть лучше в случаях, когда назначение value
дорого и выгоды от перемещения семантики.
обновление для C++17, вы можете использовать:
std::unordered_map::insert_or_assign()
http://en.cppreference.com/w/cpp/container/unordered_map/insert_or_assign
обычно вы избегаете дополнительного ввода с помощью определения функции, которая избавляет вас от ввода того же самого снова.
Если у вас нет доступа к C++17-х insert_or_assign()
, вы можете реализовать что-то вроде этого самостоятельно:
bool InsertOrAssign(std::unordered_map& m, int key, int value) {
// Your code or one of the suggested answers goes here
}