说我有std::unordered_map < int, std::vector< int > > my_hashtable
并插入一个新条目:
my_hashtable.insert(make_pair(a_key, std::vector()));
这有效,但它多次调用构造函数和赋值操作。 (1)std :: vector(),(2)make_pair参数按值传递,copy(3)make_pair按值返回类型,再次复制(4)函数insert将再次复制。
如果我算错了,请纠正我。
因此,我们制作了太多副本,我们真的应该只调用一次构造函数,我们怎样才能实现它(在C ++ 11下)?
我注意到std :: unordered_map :: insert有一个使用移动构造函数的版本,但不知道如何使用它。
答案 0 :(得分:2)
您可以查看std::unordered_map::emplace()的示例:
my_hashtable.emplace(
std::piecewise_construct,
std::forward_as_tuple(a_key),
std::forward_as_tuple()
);
这里没有不必要的构造函数调用。
答案 1 :(得分:2)
问题是map的value_type的签名:它是std::pair<map::key_type, map::mapped_type>
,其中键类型是const限定的。
这将消除复制/移动:
typedef std::unordered_map < int, std::vector< int > > hash_table:
my_hashtable.insert(hash_table::value_type(a_key, std::vector()));
示例中make_pair结果的签名很可能是std::pair<int, vector<...> >
而不是std::pair<const int, vector<...> >