Доступ к std :: map с типом указателя в качестве ключа - PullRequest
1 голос
/ 27 декабря 2011

Я пытаюсь использовать строку в качестве ключа для 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 ]

3 голосов
/ 27 декабря 2011

Решение состоит в том, чтобы не использовать указатель:

using namespace std;

string AString = "pointer";

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

cerr << AMap["pointer"];

Вы действительно не хотите, чтобы ключ карты был изменен из других частей программы, пока он находится на карте.Это просто требует неприятностей и указывает на проблему дизайна.

2 голосов
/ 27 декабря 2011

Похоже, вы пришли из 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 и затем просматривается на картестроковое значение.

2 голосов
/ 27 декабря 2011

«указатель» - это строка C, на которую указывает указатель AString в памяти.Вам нужно сделать:

cerr << AMap[AString];

Вы также можете использовать std::map<std::string,bool>, который менее подвержен ошибкам и что вы, вероятно, хотите сделать.Вы действительно хотите использовать указатель для ключа?Например, создание другого указателя, указывающего на строку со значением «указатель», не будет таким же ключом.

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