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

questionAnswers(3)

yourAnswerToTheQuestion