c++11 - 为自定义地图值多次调用复制构造函数
问题描述
我刚刚开始在 C++ 中使用地图,我实现了这段代码,其中我使用自定义数据类型作为地图值。但我还没有理解复制构造函数部分。仅在我使用时才被多次调用
person.insert(make_pair(55,Person("Bob",23)));
person.insert(make_pair(35,Person("Bill",25)));
有人可以解释一下这段代码中复制构造函数的工作吗?
#include<iostream>
#include<map>
using namespace std;
class Person{
private:
string name;
int age;
public:
Person(const Person &other){
cout<<"Copy Constructor Running !!"<<endl;
name=other.name;
age=other.age;
}
Person():name(""),age(0){
}
Person(string name,int age):name(name), age(age){
}
void print(){
cout<<name<<" : "<<age<<endl;
}
};
int main(){
map<int,Person> person;
person[50]=Person("Mike",19);
person[20]=Person("Julia",20);
person[30]=Person("Raj",29);
person[10]=Person("Kendra",20);
person[70]=Person("Rahul",18);
person.insert(make_pair(55,Person("Bob",23)));
person.insert(make_pair(35,Person("Bill",25)));
for(auto it=person.begin();it!=person.end();it++){
cout<<it->first<<" : ";
it->second.print();
}
return 0;
}
输出:
Copy Constructor Running !!
Copy Constructor Running !!
Copy Constructor Running !!
Copy Constructor Running !!
10 : Kendra : 20
20 : Julia : 20
30 : Raj : 29
35 : Bill : 25
50 : Mike : 19
55 : Bob : 23
70 : Rahul : 18
解决方案
Person("Bob",23)
构造一个临时Person
实例;让我们称之为P
。然后make_pair(55, P)
构造一个临时的pair
,复制P
到它的成员pair.second
中。最后,map::insert
将该对的元素复制到它自己的数据结构中。
person[50]=Person("Mike",19)
不使用复制构造函数,而是使用复制赋值运算符(您尚未对其进行检测,因此看不到被调用)。
如果您想减少或避免复制:
person.emplace(55, Person("Bob",23));
将执行一次复制构造函数;
person.emplace(std::piecewise_construct,
std::forward_as_tuple(55),
std::forward_as_tuple("Bob", 23));
根本不会调用复制构造函数,而是使用提供的参数Person
直接在地图的内部存储中构造对象。
推荐阅读
- sql-server - SQL Server ogr2ogr 批处理无法访问 ogr_MSSQLSpatial.dll
- r - Rcpp 中的 Gibbs 采样器双变量正态分布
- php - 在图像标签中使用 php 标签
- netty - 在 netty-tcnative 上为 solaris 构建?
- php - 在php中访问数字对象
- android - 如何使用glide,firebaseUI从firebase存储中加载recyclerview cardview中的图像?
- jquery - KendoDatePicker 日期格式为“2018 年 8 月 21 日”
- sockets - MVC JavaFX 聊天应用程序 - 套接字代码应该在哪里?
- javascript - 具有许多条件的 Imacros
- android - 以前工作的活动现在给出 ActivityNotFoundException