2013-07-30 3 views
3

맵을 초기화하는 데 문제가 있습니다. 목표는지도for 루프 내에서 맵을 초기화하는 중

map<const char *, int, ltstr > mymap; 
string fortest="a b c"; 
istringstream iss(fortest); 
string field; 
//cout<<"transaction name:"<<transactionName<<'\n'; 
//cout<<"transaction fields:"<<'\n'; 
while(iss>>field) 
{ 
    mymap[&field[0]]=0; 
    cout<<"field name:"<<field<<'\n'; 
    cout<<mymap.size()<<'\n'; 
} 

하지만이 나던 작품에 항목을 만들기 위해 모든 키 .e.g "키 1 키 2의 KEY3을"포함 된 문자열을 사용하는 것입니다. 어떤 문제인지 잘 모르겠습니다.

+2

포인터를 키로 사용하는 이유는 무엇입니까? 'std :: map '. –

+0

또한 "이 doesnt work"가 당신에게 어떤 의미인지 설명하는 것을 잊었습니다 ... –

답변

4

여기에 문제는지도에 값을 추가 한 다음 즉시 변경하는 것입니다. field의 회원이 mymap의 내부 키로 저장되기 때문에 사용자가 코드를 확장하면 당신은 기본적으로 다음과 같은

iss >> field; 
mymap[&field[0]] = 0; 
iss >> field; // Error! 
mymap[&field[0]] = 0; 

표지 선을하고있는 것은 문제이다. 세 번째 줄은 field으로 바뀌므로 mymap 내의 키도 변형됩니다. 이러한 유형의 동작은 허용되지 않으며지도 유형은 키가 변경되지 않는다고 가정합니다. 그것들을 변조하면 나중에 값을 신뢰할 수있게 검색 할 수 없게됩니다.

지도에서 int과 문자열을 연관시키는 것 같습니다. 그렇다면 std::string을 키로 사용하십시오.

map<std::string, int, ltstr> mymap; 
... 
while (iss>>field) { 
    mymap[field] = 0; 
} 

이렇게하면 각 줄에 대해 std::string의 독립 사본을지도에 표시합니다. 따라서 돌연변이는 맵의 키에 영향을 미치지 않습니다.

참고 : 당신은 가능성이

이 또한주의이 workt 변환 할 때 std::stringconst char*에이 &field[0]를 사용하지 않는 그에게 할뿐만 아니라 const char*의 입력으로 const std::string&를 취할 장에 ltstr해야합니다 대신 표준 방법 field.c_str()을 사용하십시오.

+0

감사합니다. Jared .. 지금 문제가 무엇인지 보겠습니다. – addousas

+3

'ltstr'은 거의 확실하게'strcmp'를 감싼 래퍼입니다. 'std :: string' 키를 사용하면 더 이상 필요하지 않습니다. 또한'std :: string :: cstr()'도 존재하지 않습니다. –

관련 문제