使用 insert 为 map 插值时,insert 的传参包含以下几种可能:

  • make_pair 生成对象
  • pair(key_type, value_type) 生成对象
  • pair(const key_type, value_type) 生成对象
  • map<key_type, value_type>::value_type 生成对象

不同的传参,导致不同次数的构造 / 析构函数调用。

2. 测试代码与结果

/*
在 map 中不同的 insert 传参类型,导致的不同次数的构造/析构函数调用。
*/

#include <iostream>
#include <vector>
#include <map>
#include <string>

using namespace std;

class Data
{
public:
    Data(void)
    {
        cout << "Constructor" << endl;
    }

    Data(const Data& other)
    {
        cout << "Copy Constructor" << endl;
    }

    Data& operator=(const Data& other)
    {
        cout << "Assignment operator" << endl;
        return *this;
    }

    ~Data(void)
    {
        cout << "Destructor" << endl;
    }
};

class Tracker
{
public:
    Tracker(string name)
    {
        _name = name;
        cout << "### Testing " << name << endl;
    }

    ~Tracker(void)
    {
        cout << "### Done" << endl << endl;
    }

private:
    string _name;
};

int main () {
    {
        Tracker tracker("insert data using make_pair");
        map<int, Data> c;
        Data d = Data();
        cout << "---- Begin ---- " << endl;
        c.insert(make_pair(1, d));
        cout << "----- End -----" << endl;
    }

    {
        Tracker tracker("insert data using pair<key_type, value_type>");
        map<int, Data> c;
        Data d = Data();
        cout << "---- Begin ---- " << endl;
        c.insert(pair<int, Data>(1, d));
        cout << "----- End -----" << endl;
    }

    {
        Tracker tracker("insert data using pair<const key_type, value_type>");
        map<int, Data> c;
        Data d = Data();
        cout << "---- Begin ---- " << endl;
        c.insert(pair<const int, Data>(1, d));
        cout << "----- End -----" << endl;
    }

    {
        Tracker tracker("insert data using map<key_type, value_type>::value_type");
        map<int, Data> c;
        Data d = Data();
        cout << "---- Begin ---- " << endl;
        c.insert(map<int, Data>::value_type(1, d));
        cout << "----- End -----" << endl;
    }

    return 0;
}
View Code

相关文章: