2011-12-27 4 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

答えて

3

です:

using namespace std; 

string AString = "pointer"; 

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

cerr << AMap["pointer"]; 

あなたが本当にそれはですが、マップのキーは、プログラムの他の部分から変更することはしたくないが、地図上に表示されます。これはちょうどトラブルを求めて、設計上の問題を示しています。

+1

マップで共有変数をキーとして使用できないのはなぜですか? 値が変化するのでポインタを使いたいのですが、キーが変わっても同じままにしておきたいです。 –

2

"pointer"は、AStringポインタがメモリ内で指し示すC文字列です。あなたは実行する必要があります。

cerr << AMap[AString]; 

ます。また、エラーが発生しにくいと何あなたはおそらく行うことを意味しているstd::map<std::string,bool>を使用することができます。あなたは本当にキーのポインタを使用したいですか?値 "pointer"を持つ文字列を指す別のポインタを作成することは、例えば、同じキーではありません。

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"]; 

この場合、文字列へのポインタは使用しないでください。文字列ポインタのマップの代わりに文字列のマップを使用してください。

この場合、"pointer"std::stringに変換され、文字列値でマップ内で検索されるため、std::cerr << aMap["pointer"];が機能します。

関連する問題