青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

浪跡天涯

唯有努力...
努力....再努力...

CMap詳解

如何聲明CMap
許多人對(duì)Cmap的聲明模式CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>感到迷惑,為什么不用CMap<KEY,VALUE>呢?實(shí)際上,CMap中的的數(shù)據(jù)最終會(huì)是CPair,而CPair內(nèi)部是(KEY,VALUE)。因此,CMap其實(shí)存儲(chǔ)的是KEY,而非ARG_KEY。然而,如果你查看MFC的源代碼,幾乎CMap所有的內(nèi)部參數(shù)傳遞都是訪問ARG_KEY和ARG_VALUE,因此,使用KEY&來代替ARG_KEY似乎是正確的,除了在這些情況下:
1 應(yīng)用簡單的數(shù)據(jù)類型,如int ,char用值傳遞與參數(shù)傳遞沒有什么不同
2 如果用CString作為KEY,你應(yīng)該用LPCTSTR   做ARG_KEY而非CString&,接下來我門會(huì)討論原因。

如何讓CMap類為自己工作
好的,就象我前面說過的,CMap是一個(gè)哈西表,一個(gè)哈西表要有“哈西值“——一個(gè)UINT類型,用哈西值作為在哈西表中的序數(shù)。如果有更多的相同的關(guān)鍵字,他們會(huì)組成一個(gè)鏈表。因此,你應(yīng)該首先構(gòu)造哈西函數(shù)。CMap類會(huì)調(diào)用摸板函數(shù)HashKey()來構(gòu)造哈西函數(shù)。缺省應(yīng)用和特別版的LPCSTR和LPCWSTR如下:

// inside <afxtemp.h>
template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
    // default identity hash - works for most primitive values
    return (DWORD)(((DWORD_PTR)key)>>4);
}// inside <strcore.cpp>
// specialized implementation for LPCWSTR
#if _MSC_VER >= 1100
template<> UINT AFXAPI HashKey<LPCWSTR> (LPCWSTR key)
#else
UINT AFXAPI HashKey(LPCWSTR key)
#endif
{
    UINT nHash = 0;
    while (*key)
        nHash = (nHash<<5) + nHash + *key++;
    return nHash;
}// specialized implementation for LPCSTR
#if _MSC_VER >= 1100
template<> UINT AFXAPI HashKey<LPCSTR> (LPCSTR key)
#else
UINT AFXAPI HashKey(LPCSTR key)
#endif
{
    UINT nHash = 0;
    while (*key)
        nHash = (nHash<<5) + nHash + *key++;
    return nHash;
}
正如你所見到的,缺省行為是“假定“關(guān)鍵字是一個(gè)指針,并且轉(zhuǎn)變成DWORD類型,這就是為什么會(huì)出現(xiàn)“error C2440:’type cast’:cannot convert from ‘ClassXXX’to ‘DWORD_PTR’”如果你不提供一個(gè)特別的HashKey()函數(shù)給你的類就會(huì)出現(xiàn)上述情況。并且由于MFC僅僅提供了特殊的工具LPCSTR和LPCWSTR,卻沒有提供CStringA或CStringW,如果你想要在CMap中用CString,就必須聲明CMap<CString ,LPCSTR….>,OK,現(xiàn)在你知道怎么計(jì)算CMap的哈西值了,但是因?yàn)橐粋€(gè)關(guān)鍵字可能對(duì)應(yīng)多個(gè)哈西值,CMap就需要找遍整個(gè)鏈表來找到正確的“摸板”,不僅用同樣的“哈西值”。當(dāng)CMap不匹配時(shí),就會(huì)訪問CompareElements(),另一個(gè)摸板方程。// inside <afxtemp.h>
// noted: when called from CMap,
//        TYPE=KEY, ARG_TYPE=ARG_TYPE
// and note pElement1 is TYPE*, not TYPE
template<class TYPE, class ARG_TYPE>
BOOL AFXAPI CompareElements(const TYPE* pElement1,
                            const ARG_TYPE* pElement2)
{
    ASSERT(AfxIsValidAddress(pElement1,
           sizeof(TYPE), FALSE));
    ASSERT(AfxIsValidAddress(pElement2,
           sizeof(ARG_TYPE), FALSE));    // for CMap<CString, LPCTSTR...>
    // we are comparing CString == LPCTSTR
    return *pElement1 == *pElement2;
}
因此,如果你想在自己的類中用CMap,你不得不重寫HashKey()和CompareElements()
結(jié)束語
1 CMap是一個(gè)哈西表,而STL::map是一個(gè)樹表,對(duì)他們做比較是沒有意義的。但是,如果你你要重新找到有序的關(guān)鍵字,你就得使用STL::map
2 HashKey()的設(shè)計(jì)是高效的。你應(yīng)該提供一個(gè)較少?zèng)_突的HashKey(),并且容易計(jì)算。你要記注,對(duì)于有些類來說,這不容易。
3 當(dāng)用Cmap(或STL::hash_map),要注意哈西表的大小。

附能用于CString的CMap重寫的HashKey()和CompareElements()
using namespace std;
template<>
UINT AFXAPI HashKey<CString*> (CString* key)
{
 return (NULL == key) ? 0 : HashKey((LPCTSTR)(*key));
}

// I don't know why, but CompareElements can't work with CString*
// have to define this
typedef CString* LPCString;

template<>
BOOL AFXAPI CompareElements<LPCString, LPCString> (const LPCString* pElement1,
               const LPCString* pElement2)
{
 if ( *pElement1 == *pElement2 ) {
  // true even if pE1==pE2==NULL
  return true;
 } else if ( NULL != *pElement1 && NULL != *pElement2 ) {
  // both are not NULL
  return **pElement1 == **pElement2;
 } else {
  // either one is NULL
  return false;
 }
}:

posted on 2008-01-24 15:41 浪跡天涯 閱讀(4333) 評(píng)論(2)  編輯 收藏 引用 所屬分類: C++

評(píng)論

# re: CMap詳解 2008-01-24 15:47 浪跡天涯

以下是實(shí)現(xiàn)忽略大小寫的HashKey函數(shù)以及KeyCompare函數(shù):
// 實(shí)現(xiàn)忽略大小寫的
template<>
inline bool HS_HashKey<char*>::KeyCompare( char* const&key1, char* const&key2)
{
return stricmp(key1, key2) == 0;
}

template<>
inline unsigned int HS_HashKey<char*>::KeyHash( char* const&lkey)
{
unsigned int nHash = 0;
const char* key = lkey;
while (*key)
{
if(*key >= 'A' && *key <= 'Z')
{
nHash = (nHash<<5) + nHash + *key++;
nHash += ('a' - 'A');
}
else
nHash = (nHash<<5) + nHash + *key++;
}
return nHash;
}
  回復(fù)  更多評(píng)論   

# re: CMap詳解 2008-06-06 17:21 11

不知所云  回復(fù)  更多評(píng)論   

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(22)

隨筆分類(30)

隨筆檔案(29)

文章分類

搜索

積分與排名

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲日本成人| 欧美日韩视频不卡| 99天天综合性| 亚洲日本一区二区三区| 欧美黄色aaaa| 亚洲人成网站在线观看播放| 亚洲精品黄网在线观看| 一本色道久久综合亚洲91| 亚洲一级网站| 久久九九精品| 欧美国产日韩一二三区| 欧美视频中文字幕在线| 国产欧美日韩亚洲精品| 在线免费不卡视频| 在线天堂一区av电影| 欧美在线免费视屏| 欧美ed2k| 在线视频欧美日韩精品| 欧美在线二区| 欧美久久久久中文字幕| 国产日韩欧美三级| 亚洲精品日韩在线| 欧美在线短视频| 亚洲国产精品久久人人爱蜜臀 | 新片速递亚洲合集欧美合集| 欧美在线影院在线视频| 亚洲国产精品一区二区三区| 一区二区三区精品视频| 国产深夜精品| 久久爱www.| 蘑菇福利视频一区播放| 在线播放豆国产99亚洲| 欧美—级高清免费播放| 午夜一区不卡| 最新日韩在线视频| 久久综合999| 亚洲午夜精品久久久久久app| 国产日韩在线视频| 欧美精品粉嫩高潮一区二区| 免费成人性网站| 久久久91精品国产一区二区精品| 亚洲精品一品区二品区三品区| 久久精品视频免费播放| 亚洲天堂成人在线观看| 亚洲私人黄色宅男| 亚洲一区二区三区高清 | 国产伦精品一区二区| 欧美精品成人| 欧美成人在线网站| 欧美日韩小视频| 国产精品免费小视频| 欧美日韩日韩| 国产精品免费看| 黄色另类av| 在线观看视频一区二区| 亚洲欧洲一区二区三区在线观看| 亚洲影音一区| 99re热精品| 一本一道久久综合狠狠老精东影业| 99国产精品久久| 亚洲一区在线免费观看| 久久久久久一区二区| 亚洲二区在线视频| 9i看片成人免费高清| 亚洲男人av电影| 欧美精品一区二区三区蜜桃| 国产精品红桃| 国产一级一区二区| 亚洲深夜福利在线| 久久黄金**| 亚洲国产一区在线观看| 亚洲你懂的在线视频| 欧美极品一区| 国产欧美精品一区二区色综合| 国产精品久久久| 亚洲国产精品成人一区二区 | 欧美制服丝袜| 久久在线视频在线| 欧美黄色精品| 久久精品1区| 伊人蜜桃色噜噜激情综合| 久久在线播放| 亚洲乱码国产乱码精品精98午夜| 亚洲精品午夜| 欧美视频免费在线| 久久久久国产精品一区二区| 欧美v日韩v国产v| 午夜欧美大尺度福利影院在线看| 国产日韩欧美在线一区| 久久久久久久一区二区| 欧美激情视频网站| 欧美在线影院| 亚洲综合久久久久| 久久不射电影网| 一区二区三区在线免费播放| 欧美区国产区| 欧美伦理一区二区| 午夜在线不卡| 亚洲欧美第一页| 日韩一级精品视频在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 在线观看三级视频欧美| 欧美在线视频一区二区三区| 欧美二区在线| 国产精品免费一区二区三区在线观看| 国产在线视频欧美一区二区三区| 99亚洲视频| 亚洲第一视频| 一区二区福利| 嫩模写真一区二区三区三州| 99精品国产热久久91蜜凸| 亚洲桃花岛网站| 午夜精品在线看| 亚洲狠狠婷婷| 欧美日韩精品在线视频| 久久xxxx精品视频| 性娇小13――14欧美| 在线一区二区三区四区五区| 噜噜爱69成人精品| 99精品欧美一区二区三区| 亚洲电影专区| 欧美私人网站| 欧美成人久久| 国产精品久久久久久久久久直播| 亚洲欧美日韩中文在线制服| 久久成人在线| 亚洲一区二区三区四区中文 | 午夜亚洲精品| 免费视频久久| 久久精品国产亚洲一区二区| 欧美www在线| 日韩视频二区| 亚洲视频专区在线| 在线午夜精品| 欧美色欧美亚洲另类二区| 欧美视频在线观看免费| 最近看过的日韩成人| 一区二区欧美精品| 欧美日韩伦理在线| 一区二区三区成人| 国产精品99久久久久久宅男| 欧美日韩高清在线| 一区二区三区四区国产| 欧美一区二区三区日韩| 国产欧美不卡| 欧美激情视频在线播放 | 久久这里有精品15一区二区三区| 国产精品三级久久久久久电影| 亚洲一区二区伦理| 免费视频一区| 久久国产精品亚洲77777| 亚洲日韩欧美一区二区在线| 欧美女激情福利| 久久精品国产一区二区三区免费看| 欧美顶级少妇做爰| 亚洲一区欧美| 亚洲人精品午夜在线观看| 另类天堂视频在线观看| 欧美激情网友自拍| 亚洲国产精品福利| 欧美日韩国产区一| 91久久精品一区二区别| 伊人天天综合| 欧美不卡一卡二卡免费版| 久久精品噜噜噜成人av农村| 欧美日韩成人在线观看| 巨胸喷奶水www久久久免费动漫| 中文日韩在线视频| 欧美成人dvd在线视频| 亚洲综合精品自拍| 欧美高清一区| 久久一区中文字幕| 欧美日韩亚洲一区在线观看| 欧美成人第一页| 久久国产综合精品| 狠狠色丁香久久婷婷综合丁香| 麻豆成人在线播放| 亚洲高清自拍| 一区二区三区久久久| 国产日本欧美在线观看| 亚洲一区二区三区久久| 欧美日韩高清一区| 欧美激情精品久久久久久久变态| 亚洲网址在线| 欧美激情精品久久久六区热门| 久久久久久高潮国产精品视| 欧美精品在线视频观看| 香蕉免费一区二区三区在线观看| 亚洲一区尤物| 国产精品看片资源| 午夜欧美精品久久久久久久| 国产在线拍偷自揄拍精品| 欧美与欧洲交xxxx免费观看 | 亚洲欧美一区二区三区极速播放| 免费成人美女女| 欧美一区三区三区高中清蜜桃 | 欧美高清一区二区| 国产亚洲激情在线| 午夜精品久久久久久| 久久精品电影|