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

我的玻璃盒子

(轉載)CMap詳解

原文連接:http://www.shnenglu.com/qiujian5628/archive/2008/01/24/41815.html

如何聲明CMap
許多人對Cmap的聲明模式CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>感到迷惑,為什么不用CMap<KEY,VALUE>呢?實際上,CMap中的的數據最終會是CPair,而CPair內部是(KEY,VALUE)。因此,CMap其實存儲的是KEY,而非ARG_KEY。然而,如果你查看MFC的源代碼,幾乎CMap所有的內部參數傳遞都是訪問ARG_KEY和ARG_VALUE,因此,使用KEY&來代替ARG_KEY似乎是正確的,除了在這些情況下:
1 應用簡單的數據類型,如int ,char用值傳遞與參數傳遞沒有什么不同
2 如果用CString作為KEY,你應該用LPCTSTR   做ARG_KEY而非CString&,接下來我門會討論原因。
如何讓CMap類為自己工作
好的,就象我前面說過的,CMap是一個哈西表,一個哈西表要有“哈西值“——一個UINT類型,用哈西值作為在哈西表中的序數。如果有更多的相同的關鍵字,他們會組成一個鏈表。因此,你應該首先構造哈西函數。CMap類會調用摸板函數HashKey()來構造哈西函數。缺省應用和特別版的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;
}
正如你所見到的,缺省行為是“假定“關鍵字是一個指針,并且轉變成DWORD類型,這就是為什么會出現“error C2440:’type cast’:cannot convert from ‘ClassXXX’to ‘DWORD_PTR’”如果你不提供一個特別的HashKey()函數給你的類就會出現上述情況。并且由于MFC僅僅提供了特殊的工具LPCSTR和LPCWSTR,卻沒有提供CStringA或CStringW,如果你想要在CMap中用CString,就必須聲明CMap<CString ,LPCSTR….>,OK,現在你知道怎么計算CMap的哈西值了,但是因為一個關鍵字可能對應多個哈西值,CMap就需要找遍整個鏈表來找到正確的“摸板”,不僅用同樣的“哈西值”。當CMap不匹配時,就會訪問CompareElements(),另一個摸板方程。// 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()
結束語
1 CMap是一個哈西表,而STL::map是一個樹表,對他們做比較是沒有意義的。但是,如果你你要重新找到有序的關鍵字,你就得使用STL::map
2 HashKey()的設計是高效的。你應該提供一個較少沖突的HashKey(),并且容易計算。你要記注,對于有些類來說,這不容易。
3 當用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;
}
}:

 

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

以下是實現忽略大小寫的HashKey函數以及KeyCompare函數:
// 實現忽略大小寫的
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;
}

posted on 2008-01-24 16:31 深藍色系統 閱讀(451) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

統計

常用鏈接

留言簿(75)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            男同欧美伦乱| 久久网站热最新地址| 国产精品扒开腿做爽爽爽软件| 亚洲乱码日产精品bd| 亚洲精品日产精品乱码不卡| 欧美.www| 国产日韩欧美日韩| 夜夜嗨一区二区| 亚洲男人的天堂在线| 久久理论片午夜琪琪电影网| 亚洲欧美在线网| 久久激情视频| 欧美成人四级电影| 欧美午夜视频网站| 免费不卡亚洲欧美| 亚洲美女黄色片| 亚洲欧美bt| 欧美成人精品一区二区| 国产精品毛片| 一区二区成人精品| 久久国产视频网| 欧美国产日韩一二三区| 国产情人综合久久777777| 国内外成人在线| 欧美亚洲视频在线观看| 亚洲精品乱码久久久久久| 亚洲免费观看视频| 噜噜噜噜噜久久久久久91| 欧美成人免费网| 亚洲香蕉在线观看| 欧美日韩在线视频一区二区| 亚洲第一级黄色片| 欧美大片免费看| 欧美成人免费大片| 日韩视频一区二区三区在线播放 | 亚洲精品一区二区三| 欧美中文字幕不卡| 在线欧美福利| 91久久在线播放| 久久字幕精品一区| 亚洲欧美在线免费| 亚洲第一网站| 亚洲黄色大片| 国产精品免费观看视频| 亚洲男人第一网站| 久久精品久久综合| 最新日韩在线| 亚洲精品视频在线看| 国产精品美女久久久久aⅴ国产馆| 亚洲另类在线一区| 亚洲午夜一区二区| 韩国成人理伦片免费播放| 亚洲国产毛片完整版| 国产精品乱看| 欧美国产日韩一区| 国产一二精品视频| 亚洲欧洲日本专区| 国内外成人免费激情在线视频| 欧美成人免费网| 国产精品爽爽ⅴa在线观看| 亚洲国产高潮在线观看| 国产一区白浆| 午夜在线精品| 亚洲免费在线播放| 欧美日韩国产一区二区三区地区 | 亚洲视频一区在线| 亚洲福利视频专区| 久久se精品一区二区| 欧美在线视频免费播放| 欧美午夜精品电影| 亚洲国产你懂的| 亚洲精品久久在线| 久久久xxx| 国产最新精品精品你懂的| 香蕉免费一区二区三区在线观看| 性欧美暴力猛交69hd| 国产精品久久久久久亚洲调教 | 中国成人在线视频| 99精品免费| 亚洲理伦在线| 欧美另类在线播放| 亚洲高清不卡av| 久久婷婷综合激情| 久久天天躁狠狠躁夜夜av| 国产一区二区av| 牛牛精品成人免费视频| 99精品久久久| 久久日韩粉嫩一区二区三区| 欧美日韩视频一区二区| 亚洲男人第一av网站| 玖玖视频精品| 亚洲午夜精品一区二区| 国产一区二区三区高清| 玖玖国产精品视频| 一本色道久久精品| 久久久国际精品| 亚洲视频自拍偷拍| 在线视频国产日韩| 国产精品美女久久福利网站| 欧美专区日韩视频| 中国成人黄色视屏| 日韩午夜剧场| 亚洲激情在线激情| 久久综合一区二区| 午夜综合激情| 亚洲久久在线| 亚洲人成在线免费观看| 国产日韩在线不卡| 久久一二三四| 亚洲一区二区在| 亚洲美女av网站| 亚洲精品极品| 在线国产精品播放| 亚洲二区在线| 亚洲欧洲精品一区二区三区 | 国产一区二区三区久久悠悠色av | 国产一区再线| 国产精品国内视频| 欧美三级不卡| 国产视频一区免费看| 国产欧美va欧美va香蕉在| 国产精品国产自产拍高清av王其 | 亚洲欧美日韩国产综合在线| 亚洲精品美女免费| 这里只有精品电影| 亚洲午夜电影| 亚洲激情一区二区三区| 久久www成人_看片免费不卡| 欧美日韩福利视频| 国产专区精品视频| 亚洲午夜久久久久久久久电影网| 久久久7777| 99在线热播精品免费| 欧美一区二区精品| 亚洲欧洲一二三| 久久裸体艺术| 欧美日韩一视频区二区| 依依成人综合视频| 欧美一区1区三区3区公司| 国产亚洲欧美一区在线观看| 亚洲福利视频一区| 老司机aⅴ在线精品导航| 亚洲福利小视频| 欧美黄色片免费观看| 欧美高清在线视频观看不卡| 亚洲免费av网站| 久久久久久久综合日本| 欧美三级日韩三级国产三级| 日韩午夜激情电影| 久久午夜电影| 久久精品国产亚洲一区二区三区| 欧美精品一区二区精品网| 精品99一区二区三区| 欧美一区二区精品在线| 亚洲午夜女主播在线直播| 欧美视频在线看| 午夜精品福利一区二区三区av| 99精品视频免费观看视频| 欧美日韩在线免费| 午夜精品一区二区三区在线播放 | 中日韩美女免费视频网址在线观看 | 久久精品国产久精国产一老狼| 亚洲精品亚洲人成人网| 欧美粗暴jizz性欧美20| 中文在线不卡| 久久精品成人欧美大片古装| 亚洲精品乱码| 欧美一级久久久| 一区二区三区在线视频免费观看| 亚洲欧洲一区二区在线播放| 欧美三级网址| 欧美国产专区| 国产美女精品视频| 亚洲国产一区二区三区高清 | 国产三级欧美三级| 亚洲国产高清aⅴ视频| 亚洲片在线资源| 国产亚洲欧美色| 亚洲视频香蕉人妖| 亚洲精品久久久蜜桃| 久久只有精品| 欧美一区二视频| 国产精品欧美久久久久无广告| 亚洲国产二区| 99re热精品| 欧美成人免费va影院高清| 久久gogo国模裸体人体| 国产精品成人一区二区网站软件 | 国产一区二区黄色| 99国产欧美久久久精品| 亚洲日韩成人| 欧美精品福利在线| 欧美激情一区二区三区蜜桃视频| 激情久久久久久| 久久综合国产精品| 亚洲国产综合视频在线观看| 亚洲国产99精品国自产| 欧美高清影院| 一本一本久久| 久久激五月天综合精品|