标签:des style blog http color 使用 os io
使用 insert 为 map 插值时,insert 的传参包含以下几种可能:
不同的传参,导致不同次数的构造 / 析构函数调用。
/* 在 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; }
分解后的 value_type 调用细节对比图
原因:value_type 的定义是: pair<const key_type,mapped_type>
参见:http://www.cplusplus.com/reference/map/map/
根据下图的流程拆解可以看出,非 const 的 key_type 导致 insert 过程增加了一次 Copy Constructor
新增的一次 Copy Constructor 来自于 make_pair 过程。
make_pair 的过程是:Constructs a pair object with its first element set to x and its second element set to y.
伪代码如下:
template <class T1,class T2> pair<T1,T2> make_pair (T1 x, T2 y) { return ( pair<T1,T2>(x,y) ); }
参见:http://www.cplusplus.com/reference/utility/make_pair/?kw=make_pair
make_pair 时的 key 使用 const 变量,并未能减少 insert 阶段的一次 Copy Constructor
const int k = 1; c.insert(make_pair(k, d));
C++ map.insert 传参类型不同,构造/析构次数不同,布布扣,bubuko.com
C++ map.insert 传参类型不同,构造/析构次数不同
标签:des style blog http color 使用 os io
原文地址:http://www.cnblogs.com/misspy/p/3865248.html