使用指针类型作为键访问std :: map

时间:2011-12-27 18:39:54

标签: c++ pointers stl map reference

我正在尝试使用字符串作为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 个答案:

答案 0 :(得分: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 :(得分: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,然后会按字符串值在地图中查找。