o desempenho do lugar é pior do que o cheque seguido pelo lugar
eu tenho umstd::unordered_map
com umvalue_type que não possui um construtor padrão, não posso fazer o seguinte
auto k = get_key();
auto& v = my_map[k];
Acabei escrevendo uma função auxiliar
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;
}
mas o desempenho foi notavelmente pior (ou seja, o construtor do value_type apareceu em perf) do que na versão a seguir.
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;
}
Eu li destd :: unordered_map :: emplace criação de objeto esse local precisa construir o objeto para ver se existe. Mas emplace está verificando se esse par de valores-chave existe no mapa antes de retornar.
Estou usando o lugar errado? Existe um padrão melhor que devo seguir que:
Não construirei meu value_type a cada pesquisa (como no meu primeiro método)Não fará a verificação para ver se value_type existe no meu mapa duas vezes (como no meu segundo método)obrigado