1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
执行结果:
疑问:
使用map下标操作如果不存在key的话,会调用默认构造函数生成一个实例,为什么会调用两次拷贝构造函数呢?下标操作的具体执行流程是什么?有什么办法可以跟踪到执行流程?
ringa_lee2017-04-17 13:23:07
如果key不存在,那麼map會幫你產生一個map
你可以試試用C++11來編一下程序,看看結果有何不同。
伊谢尔伦2017-04-17 13:23:07
參考鬍鬚老頭的回答,我模擬了一下流程
1 2 3 4 5 6 7 8 9 10 11 |
|
結果:
確實是產生了兩個臨時物件,所以會有兩次拷貝、兩次析構。
map下標大概流程:
如果key不存在的情況下
1 2 3 |
|
感謝鬍鬚老頭和araraloren的回答
高洛峰2017-04-17 13:23:07
就像上面的鬍鬚老頭說的那樣,構造一次,然後拷貝一次產生一個Pair類型,最終拷貝到Map的資料結構中
執行流程不就是你說的那樣,先尋找這個key,不存在建立一個插入進去,具體的流程比較複雜,牽涉到的呼叫很多,如果想知道可以看map的源碼,當然VS的map源碼不是寫給人看的。 。 。你可以參考其它stl的map源碼
在C++11裡面,這個操作就省勁多了,只用了一次構造就完成了,當然也調用了Move(移動)構造函數。 。
最後就是,一般不要這麼用。 。