我有一个没有默认构造函数std::unordered_map
的value_type,所以我不能执行以下操作
auto k = get_key();
auto& v = my_map[k];
我最终写了一个辅助函数
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;
}
但性能明显比以下版本差(即 value_type 的构造函数出现在 perf 中)。
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;
}
我从std::unordered_map::emplace 对象创建中读到 emplace 需要构造对象才能查看是否存在。但是 emplace 会在返回之前检查这个键值对是否存在于映射中。
我是否以错误的方式使用 emplace?有没有更好的模式我应该遵循:
- 不会在每次查找时构造我的 value_type (就像我的第一个方法一样)
- 不会检查 value_type 是否存在于我的地图中两次(如在我的第二种方法中)
谢谢