簡體   English   中英

使用運算符 [ ] 將字符串放入映射中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM