我正在创建自定义类Node
为了使用二叉树实现map<int,Node>
容器:int
地图的键是a的标识符Node
目的。在课堂里Node
我必须实现一个复制构造函数。
当插入一个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()
最有可能是因为您的地图的值类型是pair<int const, Node>
, not pair<int, Node>
:在地图中,关键是constant.
Since insert()
接受一个pair<int const, Node> const&
你提供一个pair<int, Node>
,要执行转换,必须构造一个临时变量,然后可以从该临时变量复制构造映射中的值。
要验证它,请更改此行:
pair<int, Node> toInsert = pair<int, Node>(2, node2);
进入这一行:
pair<int const, Node> toInsert = pair<int const, Node>(2, node2);
您应该会看到对复制构造函数的额外调用消失了。
另请记住,标准库容器的具体实现不需要执行特定数量的副本:实现可能会有所不同,并且不同的优化级别也可能使事情有所不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)