我有一个无序的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);
}
1条答案
按热度按时间j7dteeu81#
std::unordered_map::emplace
(类似于std::map::emplace
)允许您传递std::piecewise_construct
,以便从相应的构造函数参数中就地构造键和值。这将尽最大努力避免额外的构造函数调用。
Compiler Explorer example of this code compiling