2010-05-07 80 views
1

我是有點害怕的東西是這樣的:的std ::地圖運營商[],並自動創建新的對象

std::map<DWORD, DWORD> tmap; 
    tmap[0]+=1; 
    tmap[0]+=1; 
    tmap[0]+=1; 

由於DWORD的不自動初始化,我總是擔心TMAP [0 ]是一個遞增的隨機數。如果運行時不知道如何執行,地圖如何知道如何初始化DWORD?

是否有保證,結果總是tmap[0] == 3

+0

當你使用非標準類型時,比如'DWORD',最好描述它們的真實性,即使你認爲「每個人都應該知道」。 – AnT 2010-05-07 08:55:54

+1

不是非常相關,但我真的很討厭'操作符[]'插入對象到地圖,我更喜歡與試圖訪問'std :: vector' – 2010-05-07 08:56:16

+0

@Viktor中的超範圍元素相同的行爲:未定義? – 2010-05-07 09:17:22

回答

3

新的對象,當[]操作插入地圖,是值初始化。這是通過地圖實現來確保的,即在這個意義上它是「自動」完成的。對於DWORD類型的對象(假設它是標量類型),值初始化意味着零初始化。

通過23.3.1.2給出的定義,operator []

(*((insert(make_pair(x, T()))).first)).second 

速記的T()位爲新的對象,這將在你的情況下變成DWORD()DWORD()保證爲零。

+0

我真的不知道內置數據類型存在的值初始化。這讓我的生活更輕鬆! – user331471 2010-05-07 09:22:13

+0

我明白了。但是,如果類型T的默認構造函數很昂貴並且映射已經包含關鍵字x,那麼這個「簡寫」是痛苦無效的!還是我錯了? – user331471 2010-05-07 09:30:15

+0

@ thomas-gies:你是對的,如果按照上面所示的字面順序執行,它確實是無效的。我希望質量實現以某種方式以更合理的方式實現*等效功能。 – AnT 2010-05-07 09:33:48

4

是的。通過operator[]將新值插入到地圖中時,它是的值初始化值,對於內置數值類型(DWORD是內置類型的typedef),這意味着爲零。

0

是的。如果您傳遞給operator[]的密鑰不存在,則映射將默認構造對象並插入它。在你的情況下,它會做DWORD()這將產生一個0值