>백엔드 개발 >C++ >`std::map`에서 `char*` 키가 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

`std::map`에서 `char*` 키가 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-26 04:49:15541검색

Why Do `char*` Keys Fail in `std::map`, and How Can I Fix It?

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* 키를 비교하도록 지시하여 올바른 키를 보장합니다. 조회 및 삽입 중 일치.

따라서 원래 지도 정의를 사용하는 대신 비교를 포함하도록 수정합니다. 함수:

map g_PlayerNames;

이 수정을 통해 플레이어 이름 조회 및 업데이트 로직이 의도한 대로 작동하고 문자열 내용을 기반으로 문자* 키를 일치시키는 비교 기능을 활용합니다.

위 내용은 `std::map`에서 `char*` 키가 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.