使用 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; }