std::map의 char* 키의 복잡성
std::map과 같은 해시 기반 컨테이너를 다룰 때 키 이해 유형이 중요합니다. 다음 코드에 설명된 것처럼 char*를 맵 키로 사용할 때 특이한 문제가 발생합니다.
std::map<char*, int> g_PlayerNames;
이 코드는 플레이어 이름(char*)을 키로 저장하고 해당 정수를 값으로 저장하려고 시도합니다. 그러나 알려진 이름을 사용하여 항목을 검색하면 비교가 실패하여 예상치 못한 결과가 발생합니다.
근본 원인은 키로서의 char의 독특한 특성에 있습니다. std::map은 기본적으로 보다 작음 연산자(<)를 사용하여 키를 비교합니다. 그러나 char 포인터의 경우 이 비교는 포인터가 가리키는 문자열이 아닌 포인터 주소를 확인합니다.
이 문제를 해결하려면 실제 문자열이 아닌 실제 문자열에서 작동하는 사용자 지정 비교 함수를 제공해야 합니다. 포인터. 다음과 같은 구조체를 도입하면 이를 수행할 수 있습니다.
struct cmp_str { bool operator()(char const *a, char const *b) const { return std::strcmp(a, b) < 0; } };
이 사용자 정의 비교 함수를 제공함으로써 std::map이 참조하는 문자열을 기반으로 char* 키를 비교하도록 지시하여 올바른 키를 보장합니다. 조회 및 삽입 중 일치.
따라서 원래 지도 정의를 사용하는 대신 비교를 포함하도록 수정합니다. 함수:
mapg_PlayerNames; 이 수정을 통해 플레이어 이름 조회 및 업데이트 로직이 의도한 대로 작동하고 문자열 내용을 기반으로 문자* 키를 일치시키는 비교 기능을 활용합니다.
위 내용은 `std::map`에서 `char*` 키가 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!