[英]put string into a map using operator [ ]
我有一個map<int,string>
來為每個id
添加name
。 我有一種方法可以做到這一點。
void User::add(int id, string name) {
map<int, string>::iterator it = map.find(id);
if (it == map.end()) {
map.insert(pair<int, string>(id, name));
} else {
it->second = name;
}
}
它工作得很好。 但我想學習如何使用運算符 [] 將字符串添加到地圖中。 下面是我的代碼:
void user::add(int id, string name) {
&auto findUser = map[id];//check if an user exists
findUser.push_back(string()); // add a new string object
findUser.push_back(name); // put string into the map
}
當我運行這段代碼時,它給了我一個錯誤:沒有從“字符串”的可行轉換
&auto findUser = map[id];//check if an user exists
首先,我假設前導&
是一個錯字,因為它在聲明的那一側沒有意義。
map[id]
將查找映射到 id 的字符串。 如果沒有這樣的字符串 ,地圖將創建一個,將其填充到地圖中,並返回對全新字符串的引用。 你總是會得到一個字符串引用。
因為您將返回一個字符串引用,所以auto findUser
將是一個字符串引用。 其余的代碼試圖將字符串推入字符串,您已經看到了結果。 這是auto
的危險之一。 盡管我很喜歡它,但它向 OP 隱藏了實際的數據類型,並使錯誤消息更加神秘。
您不能有效地使用[]
作為檢查是否存在於地圖中。 當然,您可以測試空字符串,但現在您的地圖中有一個空字符串。 很快,地圖中就會出現許多空字符串。 不是一個好的解決方案。
map.find 與測試是否存在一樣好。 下一個最好的可能是map.at(id)因為如果找不到 id 它將拋出異常。
從好的方面來說,因為[]
返回對映射類型的引用,它可以像使用數組一樣使用。
name = map[id];
map[id] = name;
都是有效的。 您也可以使用指針,但這會帶來風險。 如果地圖被更改,您的指針可能會無效。
這很簡單:
void user::add(int id, string name)
{
map[id] = name;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.