c++ 以最少副本将一对添加到无序Map中

axzmvihb  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(111)

我有一个无序的Map:unordered_map<int,std::pair<Data,int>> m_map.我想定义一个函数来放置数据对象的副本。理想情况下,使用复制构造函数创建一个数据对象。这里是我尝试的东西,但我能做的最好的是复制构造函数和移动构造函数,所以2个副本。这还能改进吗?

#include  <iostream>
#include  <unordered_map>

using namespace std;

struct Data 
{
    Data() { cout <<"ctor"<<endl;}
    Data(const Data &) { cout <<"cctor"<<endl;}
    Data(const Data &&) { cout <<"mtor"<<endl;}
    
    const Data& operator=(const Data &) { cout <<"op="<<endl; return *this;}
};

unordered_map<int, std::pair<Data, int>> m_map;

void add(Data& data)
{
//  m_map.emplace(22, {data, 4}); // does not compile
//  m_map.emplace(22, data, 4); // does not compile
    m_map.emplace(22, std::pair(data,4)); // calls cctor and movector
    m_map.insert({22, {data,4}}); // calls cctor,cctor, and movector

}

int main()
{
    Data data;
    
    add(data);
}
j7dteeu8

j7dteeu81#

std::unordered_map::emplace(类似于std::map::emplace)允许您传递std::piecewise_construct,以便从相应的构造函数参数中就地构造键和值。

m_map.emplace(std::piecewise_construct,
              std::forward_as_tuple(22),      // Key, constructed in place
              std::forward_as_tuple(data,4)); // Value, constructed in place

这将尽最大努力避免额外的构造函数调用。
Compiler Explorer example of this code compiling

相关问题