stl - c++ map下标的执行流程是什么?

浏览:38日期:2023-05-20

问题描述

class A{public: A() {cout << '调用默认构造函数' << endl; } A(A& src) {cout << '调用拷贝构造函数' << endl; } ~A() {cout << '调用析构函数' << endl; }};int _tmain(int argc, _TCHAR* argv[]){ map<int,A> mapTest; cout << '=========' << endl; mapTest[0]; cout << '=========' << endl; return 0;}

执行结果: stl - c++ map下标的执行流程是什么?疑问:使用map下标操作如果不存在key的话,会调用默认构造函数生成一个实例,为什么会调用两次拷贝构造函数呢?下标操作的具体执行流程是什么?有什么办法可以跟踪到执行流程?

问题解答

回答1:

如果key不存在,那么map会帮你生成一个map<int, A>::value_type aka: pair<const int, A>(by std::make_pair),然后这个临时产生的pair插入到map当中时又会被重新构造一遍,所以会有两次拷贝。不过现在是21世纪了,可以利用Move语义来充分利用临时对象来减少拷贝。你可以试试用C++11来编一下程序,看看结果有何不同。

回答2:

参考胡须老头的回答,我模拟了一下流程

map<int,A> mapTest;cout << '=========' << endl;mapTest[0];cout << '=========' << endl;cout << '1' << endl;A temp1;cout << '2' << endl;pair<int,A> pa = std::make_pair(1,temp1);cout << '3' << endl;mapTest.insert(pa);cout << '=========' << endl;

结果:stl - c++ map下标的执行流程是什么?确实是生成了两个临时对象,所以会有两次拷贝、两次析构。map下标大概流程:如果key不存在的情况下

1.生成一个临时对象2.生成一个pair3.插入到map中

感谢胡须老头和araraloren的回答

回答3:

就像 上面的胡须老头说的那样,构造一次,然后拷贝一次产生一个Pair类型,最终拷贝到Map的数据结构中执行流程不就是你说的那样,先寻找这个key,不存在创建一个插入进去,具体的流程比较复杂,涉及到的调用很多,如果想知道可以看map的源码,当然VS的map源码不是写给人看的。。。你可以参阅其它stl的map源码在C++11里面,这个操作就省劲多了,只用了一次构造就完成了,当然也调用了Move(移动)构造函数。。最后就是,一般不要这么用。。

相关文章: