在将元素插入std :: unordered_map时避免不必要的构造函数调用?

时间:2014-03-13 17:50:28

标签: c++ c++11 stl

说我有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有一个使用移动构造函数的版本,但不知道如何使用它。

2 个答案:

答案 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<...> >