mam std::unordered_map
z VALUE_TYPE że nie ma domyślnego konstruktora, więc nie mogę wykonać następujące czynnościwydajność emplace jest gorsza niż czekiem następnie emplace
auto k = get_key();
auto& v = my_map[k];
skończyło się na napisanie funkcji pomocnika
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;
}
ale wydajność była znacznie gorsza (tj. Konstruktor value_type pojawił się w perf) niż następująca wersja.
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;
}
czytam od std::unordered_map::emplace object creation że emplace potrzeby do budowy obiektu w celu sprawdzenia, czy istnieje. Ale emplace sprawdza, czy ta para wartości klucza istnieje na mapie przed jej zwróceniem.
Czy używam emplace w niewłaściwy sposób? Czy istnieje lepszy wzorzec powinien wynikać, że:
- nie zbuduje mój VALUE_TYPE każdego odnośnika (jak w moim pierwszym metody)
- nie zrobi czek, aby zobaczyć czy VALUE_TYPE istnieje w mojej mapie dwukrotnie (jak w moim drugim sposobie)
Dzięki
Dlaczego nie można użyć drugiego podejścia z [emplace_hint] (http://en.cppreference.com/w/cpp/container/unordered_map/emplace_hint)? – nosid
@nosid: Ponieważ wymaga to podpowiedzi, której nie ma. Wszystko, co ma, to "koniec" iteratora –
Właściwie, pomyśl o tym, nie mam zielonego pojęcia, gdzie można rzetelnie uzyskać wskazówkę dla mapy "nieuporządkowanej". Wiem, że możesz użyć 'lower_bound' dla mapy, ale nie jestem pewien, czy to działa dla nieuporządkowanego, czy nie. –