我正在創建自定義類Node
以便使用map<int,Node>
容器實現二叉樹:映射的int
鍵是Node
對象的標識符。在類Node
我不得不實現一個複製構造函數。爲什麼map.insert()方法調用拷貝構造函數兩次?
當在地圖上插入一個Node
對象時,我注意到Node
的複製構造函數被調用兩次。爲什麼?
cout << "node2" << endl;
Node node2;
node2.set_depth(2);
node2.make_it_branch(3,4);
cout << "map" << endl;
map<int,Node> mapping;
cout << "toInsert" << endl;
pair<int,Node> toInsert = pair<int,Node>(2,node2);
cout << "insert" << endl;
mapping.insert(toInsert);
運行上面的代碼,輸出如下:
node2
--- Node()
map
toInsert
--- Node(const Node& orig)
insert
--- Node(const Node& orig) // Why does the copy constructor be invoked twice?
--- Node(const Node& orig) // ------------------------------------------------
--- ~Node()
--- ~Node()
--- ~Node()
--- ~Node()
哪裏是副本#3你的解釋? OP的帖子顯示了toInsert(你解釋過)的一個副本,以及兩個插入副本(你只能解釋一個副本)。另外,我不認爲你對第二部分的解釋是正確的。容器製作副本並插入它們的原因是設計上的(即它們保證你這樣做,以便你的對象在插入範圍內保持原狀),而不是因爲生命的原因。如果你不想要,你可以使用'emplace'或'std :: move'。 – us2012 2013-03-06 12:37:58
好笑,看來我誤解了這個問題。那麼,我現在也從已接受的答案中學到了一些東西。好吧。 – Bingo 2013-03-06 12:40:08