zoukankan      html  css  js  c++  java
  • 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/
  • 相关阅读:
    javascript cookie
    mark几个比较好的配色网站
    Javascrip 淡入淡出思路
    实验报告:统计字符串中子字符串出现的次数
    Javascript计算器
    《node入门》学习
    配置ionic(低版本)
    eclipse环境配置
    关于文档加载的方法
    javascript基础-《web前端最佳实践》
  • 原文地址:https://www.cnblogs.com/bugutian/p/14844888.html
Copyright © 2011-2022 走看看