首页 > 解决方案 > 为自定义地图值多次调用复制构造函数

问题描述

我刚刚开始在 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

标签: c++11stlcontainersassociative-arraycopy-constructor

解决方案


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直接在地图的内部存储中构造对象。


推荐阅读