производительность emplace хуже проверки с последующей emplace
у меня естьstd::unordered_map
стип ценности это не имеет конструктор по умолчанию, поэтому я не могу сделать следующее
auto k = get_key();
auto& v = my_map[k];
В итоге я написал вспомогательную функцию
value_type& get_value(key_type& key)
{
return std::get<0>(my_map.emplace(
std::piecewise_construct,
std::forward_as_tuple(key),
std::forward_as_tuple(args_to_construct_value)
))->second;
}
но производительность была заметно хуже (т.е. конструктор value_type обнаружился в perf), чем следующая версия.
value_type& get_value(key_type& key)
{
auto it = my_map.find(key);
if (it == my_map.end())
return std::get<0>(my_map.emplace(
std::piecewise_construct,
std::forward_as_tuple(key),
std::forward_as_tuple(args_to_construct_value)
))->second;
else
return it->second;
}
Я читаю изstd :: unordered_map :: emplace создание объекта это emplace должно создать объект, чтобы увидеть, существует ли он. Но emplace проверяет, существует ли эта пара значений ключа на карте, прежде чем она вернется.
Я использую emplace неправильный путь? Есть ли лучший шаблон, которому я должен следовать:
Не будет конструировать мой value_type при каждом поиске (как в моем первом методе)Не буду проверять, существует ли значение value_type на моей карте дважды (как во втором методе)Спасибо