2011-12-27 3 views
1

문자열을 프로그램의 다른 부분에서 변경할 수 있기 때문에 문자열을 std :: map의 키로 사용하려고하지만 가능한 문제가 발생합니다. 지도 데이터를 쉽게 저장하지만 포인터 주소를 키로 요청하고 문자열 값에서 해당 데이터에 액세스하려고하기 때문에 데이터에 액세스 할 수 없습니다. 그것의 동안 프로그램의 다른 부분에서 변경 될 수포인터 유형을 키로 사용하여 std :: map에 액세스

using namespace std; 

string AString = "pointer"; 

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

cerr << AMap["pointer"]; 

당신은 정말지도 키를하지 않으려는 : 여기

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

솔루션은 포인터를 사용하지 않는 것입니다 코드입니다 지도에서. 이것은 단지 문제를 묻고 설계 문제를 나타냅니다.

+1

지도에서 공유 변수를 키로 사용할 수없는 이유는 무엇입니까? 값이 변경되어서 포인터를 사용하고 싶습니다. 키가 변경되면 키를 그대로 유지하고 싶습니다. –

2

"포인터"는 AString 포인터가 메모리에서 가리키는 C 문자열입니다. 당신은 할 필요가 :

cerr << AMap[AString]; 

또한 경향이 적은 오류를하고 당신이 아마 할 말은 A A 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"]; 

이 경우 문자열에 대한 포인터를 사용하지 않아야합니다. 그냥 문자열 포인터 맵 대신 문자열 맵을 사용하십시오. 이 경우

, std::cerr << aMap["pointer"]; 작품은 "pointer" 때문에 std::string로 변환됩니다 다음 문자열 값에 의해지도에서 조회됩니다.

관련 문제