Каков самый быстрый способ вставки / обновления элементов карты 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 ответов


вы просто делаете (для map и unordered_map)

mydict[key]=value;

Я думаю, что это может быть быстрее всего, как это:

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
}