Ho un std::unordered_map
con un value_type che non ha un costruttore di default, quindi non posso fare quanto segueprestazioni del colloco è peggiore di controllo seguita da colloco
auto k = get_key();
auto& v = my_map[k];
ho finito per scrivere una funzione di supporto
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;
}
ma la prestazione è stata nettamente peggiore (ovvero il costruttore value_type si è mostrato in perf) rispetto alla seguente versione.
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;
}
Ho letto da std::unordered_map::emplace object creation che colloco esigenze per costruire l'oggetto per vedere se esiste. Ma emplace sta controllando per vedere se questa coppia di valori chiave esiste nella mappa prima che ritorni.
Sto usando emplace nel modo sbagliato? C'è un modello migliore che devo seguire:
- non costruirà il mio value_type ogni ricerca (come nel mio primo metodo)
- non farà il controllo per per vedere se value_type esiste nella mia mappa due volte (come nel mio secondo metodo)
Grazie
Perché non si utilizza il secondo approccio con [emplace_hint] (http://en.cppreference.com/w/cpp/container/unordered_map/emplace_hint)? – nosid
@nosid: Perché questo richiede di avere un suggerimento, che non ha. Tutto quello che ha è un iteratore di fine –
In realtà, a pensarci bene, non ho la più pallida idea di dove sia possibile ottenere in modo affidabile un suggerimento per una mappa _unordered_. So che puoi usare 'lower_bound' per una mappa, ma non sono sicuro che funzioni per non ordinato o no. –