2016-06-21 1 views
0

,비교하는 방법 CMap 키 케이스 예민하지 않습니까? 아래의 경우

typedef CMap<CString, CString, int, int> MapNameAndId; 

MapNameAndId["Dummy"] = 1; 

int nId = 0; 
if(MapNameAndId.Lookup("dummy", nId)) 
{ 
    // It should return true and nId should get updated to 1; Key Cases are different. 
} 

이 어떻게 달성 하는가? 나는 대문자와 소문자를 키에 추가 할 수 있으며, 룩업 중에는 맵에 추가하는 동안 std :: map과 같은 방법이 필요하다. Comparator가 Comparator가 처리하는 Comparator로서의 추가 인수 기능.

답변

0

가장 쉬운 방법은 모든 소문자로 저장하는 다음 소문자 인수를 검색 할

+0

하지만 std :: map처럼 비교 함수로 인수를 제공 할 수 있습니다. CMap에 사용할 수 있습니까? –

1

난 당신이 운영자 ==, 또는 UINT() 연산자를 다시 정의 할 수 있습니다 CString을에서 클래스를 파생하고 거기에 할 수 있다고 생각, 연산자는 해시를 계산하는 중입니다.

class MyString 
{ 
    operator UINT() 
    { 
     return HashKey(CString(*this).MakeUpper().operator LPCWSTR()); 
    } 


    bool operator==(const MyString& otherMyString) const 
    { 
     return (CompareNoCase(*this, otherMyString) == 0); 
    } 
} 

그런 다음 목록 선언

CMap<CMyString, CMyString&, int, int&> 
0

당신은 대문자 또는 소문자의 키를 저장하고, 키의 경우에 입력 검색 문자열을 변환하는 사용자 지정 코드를 작성할 수 있어야한다.

불행하게도, 사용자 정의 비교를 지원 std::map 달리, CMap는 사용자 지정 수준을 제공하지 않습니다 당신이 읽을 수있는 것처럼

template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE > 
class CMap : public CObject 

은 사용자 정의 비교기에 대한 옵션이 없습니다.

일반적으로 MFC 응용 프로그램에서도 이전 MFC 컨테이너보다 훨씬 잘 설계된 STL 컨테이너 클래스 템플릿을 사용하는 것이 좋습니다.

관련 문제