• map中insert和用=赋值时调用的构造函数详情


    网上大把的map把结构体作为key的博客,但是对于结构体作为值,说明的就很少了。
    一个测试用例来说明insert和用等号赋值的区别。

    #include <iostream>
    #include <string>
    #include <map>
    #include <stdio.h>
    #include <stdlib.h>
    
    using namespace std;
    
    struct Node{
        int a;
        Node(){ a=-9; cout << "Construct null " << a << endl;}
        Node(int tmp){ a=tmp; cout << "Construct " << a << endl; }
        ~Node(){ cout << "Destruct " << a << endl; }
        Node(const Node& node){ a = node.a; cout << "Copy node " << a << endl;}
        Node& operator =(const Node& node){ a = node.a; cout << "= node " << a << endl; return *this;}
    };
    
    int main()
    {
        std::map<int,Node> ff;
        cout << "**********************" << endl;
        Node m = Node(1);
        cout << "**********************" << endl;
        Node n = Node(2);
        cout << "**********************" << endl;
        Node l = Node(3);
        cout << "**********************" << endl;
        std::pair<int,Node> o(2,n);
        cout << "**********************" << endl;
        ff.insert( o );
        cout << "**********************" << endl;
        ff[1] = m;
        cout << "**********************" << endl;
        ff.insert(std::make_pair(3,l));
        cout << "**********************" << endl;
        ff[4] = Node(4);
        cout << "**********************" << endl;
        ff.erase(1);
        cout << "**********************" << endl;
        ff.erase(2);
        cout << "**********************" << endl;
        ff.erase(3);
        cout << "**********************" << endl;
        ff.erase(4);
        cout << "**********************" << endl;
        return 0;
    }
    

    结果如下:

    **********************
    Construct 1
    **********************
    Construct 2
    **********************
    Construct 3
    **********************
    Copy node 2
    **********************
    Copy node 2
    Copy node 2
    Destruct 2
    **********************
    Construct null -9
    Copy node -9
    Copy node -9
    Destruct -9
    Destruct -9
    = node 1
    **********************
    Copy node 3
    Copy node 3
    Copy node 3
    Copy node 3
    Destruct 3
    Destruct 3
    Destruct 3
    **********************
    Construct 4
    Construct null -9
    Copy node -9
    Copy node -9
    Destruct -9
    Destruct -9
    = node 4
    Destruct 4
    **********************
    = node 3
    **********************
    Destruct 1
    **********************
    Destruct 2
    **********************
    Destruct 3
    **********************
    Destruct 3
    **********************
    Destruct 2
    Destruct 3
    Destruct 2
    Destruct 1
    

    总结:
    从上面可以看出
    ff.insert(std::make_pair(3,l));调用的是拷贝构造函数;
    ff[4] = Node(4);
    如果该key不存在,会先调用无参数的构造函数,会调用拷贝构造函数,再调用"="运算符拷贝对象;
    如果该key存在,会直接调用"="运算符拷贝对象;

    因此,当需要将结构体作为值插入map时,需要实现结构体的如上几个构造函数和"="运算符重载。

    转载请注明来源:https://www.cnblogs.com/bugutian/
  • 相关阅读:
    JVM、GC与HashMap
    自己用到的相关Linux命令,谨以记录
    HashMap
    Groovy简洁开发,我用到的简洁之处
    java,大数据批量插入、更新
    JDBC远程从一个MySql数据库中的一张表里面读出数据(这个数据库需要用SSH隧道连接,大约8W条数据),然后分别插入到另一个数据库中的两张表里
    maven安装 maven上传jar包到库里面
    关于java中是引用传递还是值传递的问题
    SQL优化
    servlet生命周期与工作原理
  • 原文地址:https://www.cnblogs.com/bugutian/p/14844888.html
Copyright © 2020-2023  润新知