J'ai un std::unordered_map
avec un value_type qui ne dispose pas d'un constructeur par défaut donc je ne peux pas faire ce qui suitperformance de emplace est pire que vérifier suivie emplace
auto k = get_key();
auto& v = my_map[k];
Je fini par écrire une fonction d'aide
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;
}
mais les performances étaient nettement plus mauvaises (ie le constructeur de value_type apparu dans perf) que la version suivante.
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;
}
Je lis de std::unordered_map::emplace object creation que emplace besoins pour construire l'objet afin de voir si elle existe. Mais emplace vérifie si cette paire de valeurs de clé existe dans la carte avant son retour. Est-ce que j'utilise emplace dans le mauvais sens? Y at-il un meilleur modèle que je dois suivre que:
- ne construira pas mon value_type chaque recherche (comme dans ma première méthode)
- ne fera pas le chèque pour voir si value_type existe dans ma carte deux fois (comme dans ma deuxième méthode)
Merci
Pourquoi utilisez-vous pas la deuxième approche avec [emplace_hint] (http://en.cppreference.com/w/cpp/container/unordered_map/emplace_hint)? – nosid
@nosid: Parce que cela vous oblige à avoir un indice, ce qu'il n'a pas. Tout ce qu'il a est un itérateur «de fin» –
En fait, en y repensant, je n'ai pas l'idée la plus fugitive où l'on puisse avoir un indice fiable pour une carte non numérotée. Je sais que vous pouvez utiliser 'lower_bound' pour une carte, mais je ne suis pas sûr que cela fonctionne pour les non-ordonnés ou non. –