#include <iostream> #include <map> //map #include <string> //string using namespace std; class testDemo { public: testDemo(int num) :num(num) { std::cout << "呼叫建構函式" << endl; } testDemo(const testDemo& other) :num(other.num) { std::cout << "呼叫拷貝建構函式" << endl; } testDemo(testDemo&& other) :num(other.num) { std::cout << "呼叫移動建構函式" << endl; } private: int num; }; int main() { //建立空 map 容器 std::map<std::string, testDemo>mymap; cout << "insert():" << endl; mymap.insert({ "http://c.biancheng.net/stl/", testDemo(1) }); cout << "emplace():" << endl; mymap.emplace( "http://c.biancheng.net/stl/:", 1); cout << "emplace_hint():" << endl; mymap.emplace_hint(mymap.begin(), "http://c.biancheng.net/stl/", 1); return 0; }程式輸出結果為:
insert():
呼叫建構函式
呼叫移動建構函式
呼叫移動建構函式
emplace():
呼叫建構函式
emplace_hint():
呼叫建構函式
//構造類物件 testDemo val = testDemo(1); //呼叫 1 次建構函式 //構造鍵值對 auto pai = make_pair("http://c.biancheng.net/stl/", val); //呼叫 1 次移動建構函式 //完成插入操作 mymap.insert(pai); //呼叫 1 次移動建構函式而完成同樣的插入操作,emplace() 和 emplace_hint() 方法都只呼叫了 1 次建構函式,這足以證明,這 2 個方法是在 map 容器內部直接構造的鍵值對。
因此,在實現向 map 容器中插入鍵值對時,應優先考慮使用 emplace() 或者 emplace_hint()。