이 질문은 using char as a key in stdmap과 직접 관련이 있습니다.std :: map에서 char *를 키로 사용하면 어떻게 동작합니까?
나는 compare 함수가 전달한 것과 왜 char *
타입이 필수인지 이해한다. 그러나 업데이트가 실제로 어떻게 작동하는지 저는 확신 할 수 없습니다.
키를 업데이트하는 경우에 대해 궁금합니다. std::map
은 const 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
필자는 memcmp 유형의 작동이 심오하다고 생각합니다. – Whyrusleeping
'std :: string'을 키로 사용하지 않는 특별한 이유는 무엇입니까? – nneonneo
교수님이 위의'cmp_str' 함수를 작성하고 질문을 제기했지만 질문에 대한 답변이 없습니다. 나는 몇 가지 테스트를 실시했으나 파산 된 가장자리 케이스를 찾을 수 없었지만, 테이블에 다른 항목을 삽입한다고 가정 할 때 작동 방식에 여전히 난처했다. – travis