2016-06-21 4 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として余分な引数として機能します。

答えて

0

最も簡単な方法は、私はあなたがのCStringからクラスを派生させることができ、その中にあなたが演算子==、またはUINT()演算子を再定義することができると思い小文字のすべてのものを保存した後、小文字の引数で

+0

しかし、std :: mapのように、比較関数として引数を与えることができます。これはCMapで利用できますか? –

1

を検索するだろう演算子はハッシュを計算する方法にあります。

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コンテナクラステンプレートを使用することをお勧めします。

関連する問題