2012-10-15 3 views
7

이 질문은 using char as a key in stdmap과 직접 관련이 있습니다.std :: map에서 char *를 키로 사용하면 어떻게 동작합니까?

나는 compare 함수가 전달한 것과 왜 char * 타입이 필수인지 이해한다. 그러나 업데이트가 실제로 어떻게 작동하는지 저는 확신 할 수 없습니다.

키를 업데이트하는 경우에 대해 궁금합니다. std::mapconst char * 사이의 평등을 비교하는 방법을 알고, cmp_str은 트리에 키를 삽입하는 순서 만지도에 알려줍니다.

stl_tree.h 코드 (pulled from here)를 조금 파고 들었지만 많이 찾지 못했습니다. 내 유일한 추측은 그것의 직선적 인 메모리 비교를하고있다.

밑에있는 stl_tree 클래스가이 상황을 처리하는 방법에 관심이 있거나 올바르게 처리하지 못하는 경우 어떤 엣지 케이스가 깨지나요?

코드

#include <map> 
#include <iostream> 
#include <cstring> 

struct cmp_str 
{ 
    bool operator()(char const *a, char const *b) 
    { 
     return std::strcmp(a, b) < 0; 
    } 
}; 

int main (int argc, char ** argv) 
{ 

    std::map<const char*, int, cmp_str> map; 

    map["aa"] = 1; 
    map["ca"] = 2; 
    map["ea"] = 3; 
    map["ba"] = 4; 

    map["ba"] = 5; 
    map["bb"] = 6; 

    map["ba"] = 7; 

    std::map<const char*, int, cmp_str>::iterator it = map.begin(); 
    for (; it != map.end(); it++) 
    { 
     std::cout << (*it).first << ": " << (*it).second << std::endl; 
    } 

    return 0; 

} 

출력

aa: 1 
ba: 7 
bb: 6 
ca: 2 
ea: 3 
+0

필자는 memcmp 유형의 작동이 심오하다고 생각합니다. – Whyrusleeping

+1

'std :: string'을 키로 사용하지 않는 특별한 이유는 무엇입니까? – nneonneo

+0

교수님이 위의'cmp_str' 함수를 작성하고 질문을 제기했지만 질문에 대한 답변이 없습니다. 나는 몇 가지 테스트를 실시했으나 파산 된 가장자리 케이스를 찾을 수 없었지만, 테이블에 다른 항목을 삽입한다고 가정 할 때 작동 방식에 여전히 난처했다. – travis

답변

6

정렬 된 용기를 모두 등가 클래스를 사용합니다.

참고 : 포인터를지도에 계속 저장해야합니다. 포인터가 범위를 벗어나면 이상한 결과가 발생합니다. 물론 문자열 리터럴은 프로그램의 수명 기간 동안 유효합니다.

6

음은 cmp_str는 동일한 키를 찾을 수 있습니다. cmp_str::operator(x,y)cmp_str::operator(y,x)이 모두 false 인 경우 중복 키를 발견했습니다. 정말로 그다지 많은 것이 없습니다. 당신이 바이너리 조건 !pred(a, b) && !pred(b, a)를 사용하여 표기를 주장하는 경우, !(a < b) && !(b < a) 나 : 어느 하나가 다른 것보다 작은 경우 ab가 동등한 것으로 간주되어 두 값 :

+0

@ Prætorian yup, thx. –

+1

downvote에 대한 의견은 건설적인 것입니다. –