2014-03-13 23 views
2

說我有std::unordered_map < int, std::vector< int > > my_hashtable和我插入一個新條目:在向std :: unordered_map插入元素時避免不必要的構造函數調用?

 
my_hashtable.insert(make_pair(a_key, std::vector())); 

這工作,但它調用構造函數和賦值OPS多次。 (1)std :: vector(),(2)make_pair參數是按值傳遞,copy(3)make_pair按值返回類型,再次複製(4)函數插入會再次複製。

請糾正我,如果我算錯了。因此,我們製作了太多的副本,我們真的只應該調用構造函數一次,我們如何才能實現這一點(在C++ 11下)?

我注意到std :: unordered_map :: insert有一個使用move構造函數的版本,但不知道如何使用它。

回答

1

可以檢查std::unordered_map::emplace()的例子:

my_hashtable.emplace(
    std::piecewise_construct, 
    std::forward_as_tuple(a_key), 
    std::forward_as_tuple() 
); 

在這裏,有沒有不必要的構造函數調用。

+0

這正是我要尋找:) – szli

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

相關問題