搜尋

首頁  >  問答  >  主體

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

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

<code>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;

}</code>

执行结果:

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

PHP中文网PHP中文网2812 天前732

全部回覆(3)我來回復

  • ringa_lee

    ringa_lee2017-04-17 13:23:07

    如果key不存在,那麼map會幫你產生一個map::value_type aka: pair(by std::make_pair),然後這個臨時產生的pair插入到map當中時又會被重新構造一遍,所以會有兩次拷貝。不過現在是21世紀了,可以利用Move語意來充分利用臨時物件來減少拷貝。
    你可以試試用C++11來編一下程序,看看結果有何不同。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:23:07

    參考鬍鬚老頭的回答,我模擬了一下流程

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    <code>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;</code>

    結果:

    確實是產生了兩個臨時物件,所以會有兩次拷貝、兩次析構。
    map下標大概流程:
    如果key不存在的情況下

    1

    2

    3

    <code>1.生成一个临时对象

    2.生成一个pair

    3.插入到map中</code>

    感謝鬍鬚老頭和araraloren的回答

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 13:23:07

    就像上面的鬍鬚老頭說的那樣,構造一次,然後拷貝一次產生一個Pair類型,最終拷貝到Map的資料結構中
    執行流程不就是你說的那樣,先尋找這個key,不存在建立一個插入進去,具體的流程比較複雜,牽涉到的呼叫很多,如果想知道可以看map的源碼,當然VS的map源碼不是寫給人看的。 。 。你可以參考其它stl的map源碼
    在C++11裡面,這個操作就省勁多了,只用了一次構造就完成了,當然也調用了Move(移動)構造函數。 。
    最後就是,一般不要這麼用。 。

    回覆
    0
  • 取消回覆