在下面的例子中,
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 :(得分: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容器好得多。