如何比较CMap Key Case Insensitive?

时间:2016-06-21 08:15:21

标签: c++ mfc

在下面的例子中,

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负责它。

3 个答案:

答案 0 :(得分:1)

我认为你可以从CString派生一个类,你可以在其中重新定义operator ==或UINT()运算符,运算符是计算哈希的方式。

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&>

答案 1 :(得分:0)

最简单的方法是将所有内容存储为小写,然后使用小写参数

进行搜索

答案 2 :(得分:0)

您可以将密钥存储为大写或小写,并编写自定义代码以将输入搜索字符串转换为密钥的大小写。

不幸的是,与支持自定义比较的std::map不同,CMap并未提供此级别的自定义:

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

正如您所读到的,自定义比较器没有选项。

通常,即使在MFC应用程序中,我也鼓励您使用 STL 容器类模板,这些模板的设计要比旧的MFC容器好得多。