2011-12-27 70 views
1

我想使用一個字符串作爲std :: map的鍵,因爲該字符串可以從程序的不同部分進行更改,但我遇到了一個問題,很容易將數據存儲在地圖中,但我無法訪問它,因爲它要求指針地址作爲鍵,我想從字符串的值中訪問該數據。使用指針類型作爲鍵訪問std :: map

下面是代碼

using namespace std; 

string *AString = "pointer"; 

map<string *, bool> AMap; //Declare 
AMap[AString] = true; //Insert into map with key AString 

cerr << AMap["pointer"]; //Does not work 
+3

您不能更改std :: map中條目的鍵。我想你必須重新思考爲什麼你不想這樣做。您可以將字符串存儲爲密鑰,每次更改密鑰時,都會擦除舊條目並使用更新後的密鑰將其重新插入到地圖中。 – P3trus 2011-12-27 18:50:26

回答

3

的解決方法是不使用指針:

using namespace std; 

string AString = "pointer"; 

map<string, bool> AMap; 
AMap[AString] = true; 

cerr << AMap["pointer"]; 

你真的不想要一個映射鍵從程序的其他部分改變,而它的在地圖中。這只是要求麻煩並且表明設計問題。

+1

爲什麼我們不能在地圖中使用共享變量作爲鍵? 我想使用一個指針,因爲這個值發生了變化,我希望這個鍵如果發生變化,保持不變。 – 2011-12-27 20:10:09

2

「指針」是AString指針在內存中指向的C字符串。你需要做的:

cerr << AMap[AString]; 

你也可以使用一個std::map<std::string,bool>這是不容易出錯,哪些是你大概的意思做。你真的想用鑰匙指針嗎?指向指向具有值「指針」的字符串的另一個指針將不是同一個密鑰。

std::string *BString(new std::string("pointer")); 
AMap[BString] = true; //Not the same key 
2

看起來你可能會來自Java或C#?

std::string aString = "Not a Pointer"; 
std::map<std::string, bool> aMap; 
aMap[aString] = true; 
std::cerr << aMap["pointer"]; 

在這種情況下,您不應該使用指向字符串的指針。只需使用字符串映射而不是字符串指針映射。

在這種情況下,std::cerr << aMap["pointer"];的工作原理是"pointer"轉換爲std::string,然後在字符串值中查找。