2012-12-25 19 views
2

考慮下面的代碼:std :: map make_pair - 如何僅在密鑰未列出時更改配對(否則更新密鑰)?

std::map <string,string> myMap; 
myMap.insert(std::make_pair("first_key" , "no_value")); 
myMap.insert(std::make_pair("first_key" , "first_value")); 
myMap.insert(std::make_pair("second_key" , "second_value")); 

typedef map<string, string>::const_iterator MapIterator; 
for (MapIterator iter = myMap.begin(); iter != myMap.end(); iter++) 
{ 
    cout << "Key: " << iter->first << endl << "Values:" << iter->second << endl; 
} 

輸出是:

Key: first_key 
Values:no_value 
Key: second_key 
Values:second_value 

含義是,第二次分配:

myMap.insert(std::make_pair("first_key" , "first_value")); 

未能成行。

只有鑰匙還沒有列出,如果列出 - 如何更改其值?

是否有任何std :: map的通用方法?

+1

你爲什麼需要'make_pair'?我的意思是,更傳統的'myMap [「first_key」] =「first_value」'有什麼問題? – dasblinkenlight

回答

4

插入

if (myMap.find("first_key") == myMap.end()) { 
    myMap.insert(std::make_pair("first_key" , "first_value")); 
} 
else { 
    myMap["first_key"] = "first_value"; 
} 
5

使用operator []前加一個條件,或使用find和變化值,如果鍵瑤池。 如果沒有這樣的密鑰和更新值,如果密鑰存在,會在地圖中插入一對。

myMap["first_key"] = "first_value"; 

或者這樣:

auto pos = myMap.find("first_key"); 
if (pos != myMap.end()) 
{ 
    pos->second = "first_value"; 
} 
else 
{ 
    // insert here. 
} 
+0

+1,由於顯而易見的原因,前者通常用於insert-else-update場景中,因爲它的簡單性和*簡潔性*。 – WhozCraig

0

它更有效地避免搜索地圖第二次當值存在:

const iterator i = myMap.find("first_key"); 
if (i == myMap.end()) { 
    myMap.insert(std::make_pair("first_key" , "first_value")); 
} else { 
    i->second = "first_value"; 
} 
0

你可以利用insert()返回值。它返回一個pair,其中iterator指的是地圖中的元素作爲第一個值,bool作爲第二個值。

#include <iostream> 
#include <map> 

using namespace std; 

int main() 
{ 
    map<string, string> myMap; 
    pair< map<string, string>::iterator, bool > ret; 

    ret = myMap.insert(
    map <string, string>::value_type("first key", "no value")); 
    if (!ret.second) 
    { 
    ret.first->second = "no value"; 
    } 
    ret = myMap.insert(
    map <string, string>::value_type("first key", "first value")); 
    if (!ret.second) 
    { 
    ret.first->second = "first value"; 
    } 
    ret = myMap.insert(
    map <string, string>::value_type("second key", "second value")); 
    if (!ret.second) 
    { 
    ret.first->second = "second value"; 
    } 

    typedef map <string, string>::const_iterator MapIterator; 
    for (MapIterator iter = myMap.begin(); iter != myMap.end(); iter++) 
    { 
    cout << "Key: " << iter->first << endl << "Values: " << iter->second << endl; 
    } 
} // main 

insert()返回False如果重點存在和價值尚未分配。這有點複雜,但使用標準設施。