假設我們有一個std ::地圖,聲明如下:如果在std :: map中操作不存在的鍵值對會發生什麼?
std::map<int, int> m;
然後,我們立即這樣做:
m[0]++;
會發生什麼?根據我的小實驗,m [0]變爲'1',就好像爲'0'鍵存儲了'0'一樣。
但是如果地圖包含自定義類型呢?
std::map<E, T> m;
m[e].function();
會這樣嗎?
其實我想知道C++標準是如何規定這個:)
假設我們有一個std ::地圖,聲明如下:如果在std :: map中操作不存在的鍵值對會發生什麼?
std::map<int, int> m;
然後,我們立即這樣做:
m[0]++;
會發生什麼?根據我的小實驗,m [0]變爲'1',就好像爲'0'鍵存儲了'0'一樣。
但是如果地圖包含自定義類型呢?
std::map<E, T> m;
m[e].function();
會這樣嗎?
其實我想知道C++標準是如何規定這個:)
的operator[]
爲std::map
實際上creates作爲參數傳遞的元素,這樣做m[0]++
您插入int
並在其上做++
超載。沒有錯,它是1
調用此函數等同於:
(*((this->insert(make_pair(k,mapped_type()))).first)).second
說明!但是我仍然想知道,因爲你的代碼表明將會調用默認的構造函數來創建要插入的對象,這進一步意味着一旦我們的代碼超出了創建的範圍,這個對象將不再存在。這不危險嗎?或者std :: map是否真的通過調用Type的複製構造函數在內部保存了我們傳遞給它的安全副本?但是,如果是這種情況,那麼如果複製構造函數不可用(說是私有的)呢? – Diaz
@Diaz構造函數調用重載'operator []'的作用域。如果你想進一步深入地圖容器的機制 - 爲什麼不自己檢查一下呢?由於它是一個模板,因此如果您在編譯器包含目錄中搜索,則代碼應該可用。順便說一句 - 我的答案代碼取自我提供的鏈接:) –
當您使用operator[]
的訪問項目的std::map
將推出一個「空」的元素。
如果你不想有一個空的元素,那麼你需要使用std::map::find()
來檢查元素是否存在,如果不存在,請不要使用它。
當然,只要你的型號爲T
就可以有function()
就可以了,m[e].function()
沒什麼不好。如果T
需要在調用function()
之前用一些有用的東西進行初始化,那麼您必須確保不會發生這種情況。
嘗試用自定義類型,看看:) –
@ Dgrin91當然,我可以但不可能用盡所有可能的情況。特別是,我不想從我特別設計的特殊測試用例中得出錯誤結論:) – Diaz