请帮助使用MFC CMap(或std :: map)

时间:2010-08-31 15:40:15

标签: c++ mfc map

这里有一个C++菜鸟。我正在尝试使用以下 行来调整一些代码(这意味着它们不是唯一的,但它们是唯一对此问题重要的代码)。顺便说一句,我在Windows上使用Visual Studio 2010 C ++编译器。

CMap<ATL::CAtlString,LPCTSTR,UINT,UINT> mapForDuplicates; // "dict" definition
ATL::CAtlString strDescription = ... // let's just say it gets set to a value.
UINT nFound = 0; // What is this for???
BOOL bFound = mapForDuplicates.Lookup(strDescription, nFound);
mapForDuplicates[strDescription] = 1;

现在......我真的不想在这里使用UINT,因为bool是我真正需要的。但是,我无法弄清楚CMap构造函数的所有参数究竟是什么。使用C#时,我必须指定的是键的类型和值的类型。 ATL::CAtlStringLPCSTR不匹配的事实让我感到困惑。 KEYARG_KEYVALUEARG_VALUE究竟是什么?为什么我需要全部四个,四个都可以不同?感谢。

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

注意:我可以在这里使用std::map(虽然我还没有使用它);唯一不可协商的是ATL::CAtlString - 我必须使用这种类型。如果您有疑问,请告诉我。

3 个答案:

答案 0 :(得分:1)

从类的文档开始= - 这里也有一个示例参考

http://msdn.microsoft.com/en-us/library/s897094z(VS.71).aspx

答案 1 :(得分:1)

IIRC模板的四个args就在那里你可以抛出一个类型并返回另一个(const)类型。它抛出CAtlStrings,但它会回到LPCTSTR。通常你只需要对类型指定相同的两次(例如int,int,float,float为int的地图 - &gt;浮点数)。

Grr,额外的L现在让我感到烦恼,它对于16位Windows来说非常棒,但现在...... PCSTR就是所需要的。 'L'是Windows编程的无用附录。

nFound是从地图中出来的东西,地图映射到UINT所以nFound是UINT。

答案 2 :(得分:0)

顺便说一下,下面的伪样本对我有用。

std::set<CAtlString> setOfDescriptions;
for each(...)
{
    CAtlString strDescription = GetDescription();
    if (setOfDescriptions.find(strDescription) != setOfDescriptions.end())
    {
        // Remove a duplicate.
    }

    setOfDescriptions.insert(strDescription); // Mark as seen.
}