2010-08-31 39 views
0

a C++ noob here。我試圖調整一些代碼,使用以下代碼密鑰(意味着它們不是唯一的代碼,但它們是唯一應該對此問題重要的代碼)。順便說一下,我在Windows上使用Visual Studio 2010 C++編譯器。現在使用MFC CMap(或std :: map)的幫助請

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 - 我必須使用這種類型。如果您有任何問題,請告訴我。

回答

1

IIRC四個參數傳遞給模板有那麼你可以扔在一個類型,並得到另一(const)類型返回。在這裏它會拋出CAtlStrings,但它會返回LPCTSTR。通常你只需要指定相同的類型兩次(例如int,int,float,float爲一個ints - > float的float)。

Grr,這個額外的L現在真的讓我非常討厭,它對於16位Windows來說非常棒,但是現在...... PCSTR就是我們所需要的。 'L'是Windows編程的無用附錄。

nFound是來自地圖的東西,地圖映射到UINT所以nFound是一個UINT。

+0

謝謝,這很有幫助。當類型確實不同時,它是否使用簡單的演員?此外,'LPCSTR' thingy ...因爲我沒有迭代鍵,我應該可以將它改爲'ATL :: CAtlString',對吧? – 2010-08-31 16:04:39

+1

Atl從AtlString返回PCTSTR的速度很快。 CMap不允許你編輯密鑰,所以它想讓你回傳const。你可以嘗試使第二個參數爲一個常量AtlString,但PCTSTR就好了。 – 2010-08-31 16:26:36

1

開始與文檔的類= - 有一個裁判這裏的樣本太

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

+0

謝謝,我讀了這篇文章,它有一些,但沒有什麼幫助。我仍然不明白爲什麼需要四個參數,爲什麼和何時這些類型可能不同,以及使用情況的明確例子。有這將是非常感激。 – 2010-08-31 16:01:58

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. 
}