C++ map 插入 困惑

最近帮我同学做360 笔试题, 其中有一个题有点意思,模仿的 mlloc和free的功能,我读过 其中的源码,所以当时还是有思路的。然后就写了。写的过程中遇见一个编译问题,只怪c++基础不好,连这种问题能犯: 简化一下

class A{
private:
     int val;
public :
     A(int v):val(v){}
};
int main(){
    mapm;
    m[1] = A(1);
}

然后报错,找不到 参数为0的constructor 这个问题 困扰了我好几。 然后去 stack overflow 上问, 大致明白了。下面是链接:

http://stackoverflow.com/questions/39452064/c-subscript-operator-about-map


然后为了更加深入的理解这个问题

如下代码

class A{
public :
	int val;
public :
	A(){
		cout << "default constructor" <val = tmp.val;
	}
	A& operator= (const A& tmp){
	   	cout << "A assign constructor val is" << tmp.val<val = tmp.val;
		return *this;
	}
	~A(){
		cout << "delete val is "< m;
	m[1] = A(1);
	cout << "-----------------------------"< p = make_pair(2,A(2));
	cout << "-----------------------------"<

Output:

/*
 * -----------------------------
 *  user_defined
 *  0x7fff2ef11460
 *  default constructor
 *  0x7fff2ef113e0
 *  A copy constructor val is10
 *  cp 0x7fff2ef113e0 to 0x7fff2ef113d4
 *  A copy constructor val is10
 *  cp 0x7fff2ef113d4 to 0x1cb6c44
 *  delete val is 10
 *  0x7fff2ef113d4
 *  delete val is 10
 *  0x7fff2ef113e0
 *  A assign constructor val is1
 *  cp 0x7fff2ef11460 to 0x1cb6c44
 *  delete val is 1
 *  0x7fff2ef11460
 *  -----------------------------
 *  user_defined
 *  0x7fff2ef11470
 *  A copy constructor val is2
 *  cp 0x7fff2ef11470 to 0x7fff2ef11424
 *  delete val is 2
 *  0x7fff2ef11470
 *  -----------------------------
 *  A copy constructor val is2
 *  cp 0x7fff2ef11424 to 0x7fff2ef11484
 *  A copy constructor val is2
 *  cp 0x7fff2ef11484 to 0x1cb6c74
 *  delete val is 2
 *  0x7fff2ef11484
 *  -----------------------------
 *  user_defined
 *  0x7fff2ef114b0
 *  A copy constructor val is3
 *  cp 0x7fff2ef114b0 to 0x7fff2ef114a4
 *  A copy constructor val is3
 *  cp 0x7fff2ef114a4 to 0x7fff2ef11494
 *  A copy constructor val is3
 *  cp 0x7fff2ef11494 to 0x1cb6ca4
 *  delete val is 3
 *  0x7fff2ef11494
 *  delete val is 3
 *  0x7fff2ef114a4
 *  delete val is 3
 *  0x7fff2ef114b0
 *  -----------------------------
 *  delete val is 2
 *  0x7fff2ef11424
 *  delete val is 3
 *  0x1cb6ca4
 *  delete val is 2
 *  0x1cb6c74
 *  delete val is 1
 *  0x1cb6c44
 */


可是看出来,下表操作是先实例化一个类,然后去map中寻找有没有值的出现。没有的话,调用空参数的构造函数 然后调用两次拷贝构造函数,最后调用赋值构造函数 

而insert 是 先构造一个pair,生成pair的时候 调用一个构造函数,然后去寻找这个pair有没有出现,没有出现就3次拷贝构造函数。


中间的几次拷贝构造函数 应该都是传参的时候,中间变量

cp 0x7fff2ef113d4 to 0x1cb6c44
cp 0x7fff2ef11494 to 0x1cb6ca4

这两次应该才是真正的给map插入数据。

你要为我为什么, 我的猜想是 参数传递都是在栈上的 ,而 map是红黑树实现的 在堆上的,看下打印的地址就知道这时候才真正的new数据了。

具体细节只能看源码了,假如大家有谁知道具体的细节,希望可以留言或者链接告诉我,一起学习进步吧 .

360 的题 在我的github上

https://github.com/darbe/algorithm/tree/master/360


你可能感兴趣的:(C++ map 插入 困惑)