2014-03-27 34 views
0

假設我們有一個std ::地圖,聲明如下:如果在std :: map中操作不存在的鍵值對會發生什麼?

std::map<int, int> m; 

然後,我們立即這樣做:

m[0]++; 

會發生什麼?根據我的小實驗,m [0]變爲'1',就好像爲'0'鍵存儲了'0'一樣。

但是如果地圖包含自定義類型呢?

std::map<E, T> m; 
m[e].function(); 

會這樣嗎?

其實我想知道C++標準是如何規定這個:)

+0

嘗試用自定義類型,看看:) –

+0

@ Dgrin91當然,我可以但不可能用盡所有可能的情況。特別是,我不想從我特別設計的特殊測試用例中得出錯誤結論:) – Diaz

回答

3

operator[]std::map實際上creates作爲參數傳遞的元素,這樣做m[0]++您插入int並在其上做++超載。沒有錯,它是1

調用此函數等同於:
(*((this->insert(make_pair(k,mapped_type()))).first)).second

+0

說明!但是我仍然想知道,因爲你的代碼表明將會調用默認的構造函數來創建要插入的對象,這進一步意味着一旦我們的代碼超出了創建的範圍,這個對象將不再存在。這不危險嗎?或者std :: map是否真的通過調用Type的複製構造函數在內部保存了我們傳遞給它的安全副本?但是,如果是這種情況,那麼如果複製構造函數不可用(說是私有的)呢? – Diaz

+0

@Diaz構造函數調用重載'operator []'的作用域。如果你想進一步深入地圖容器的機制 - 爲什麼不自己檢查一下呢?由於它是一個模板,因此如果您在編譯器包含目錄中搜索,則代碼應該可用。順便說一句 - 我的答案代碼取自我提供的鏈接:) –

1

當您使用operator[]的訪問項目的std::map將推出一個「空」的元素。

如果你不想有一個空的元素,那麼你需要使用std::map::find()來檢查元素是否存在,如果不存在,請不要使用它。

當然,只要你的型號爲T就可以有function()就可以了,m[e].function()沒什麼不好。如果T需要在調用function()之前用一些有用的東西進行初始化,那麼您必須確保不會發生這種情況。

+0

我想我明白你的觀點。謝謝! – Diaz

+0

什麼是「空」元素? –

+0

由默認構造函數'T()'(與例如帶有參數「T(x)」或「T(x,y,z)」的構造函數)創建的一個。 –

相關問題