CMap与hash_map底层均采用hash stable实现,CMap是MFC提供的模板类。hash_map虽然目前并未纳入C++标准模板类库,但几乎每个版本的STL都提供了相应的实现。CMap与hash_map的存储于查询效率比较如下:
利用rand函数随机生成99999个整数构成查询数据集,紧接着申请9999个整数作为查询。测试两个模板类的插入与查询总时间,测试结果显示:当查询都不存在时CMap时间大约16ms,hash_map为0ms;当大部分查询存在时CMap时间为624,而hash_map平均为5ms。因为所有的测试都是随机产生的,因此以上的时间均为平均时间。
参考代码:
#include "stdafx.h" #include "afxtempl.h" #include <hash_map> #include <time.h> #include <iostream> using namespace std; #define DATASET 99999 #define QUERYNUM 9999 int _tmain(int argc, _TCHAR* argv[]) { srand((unsigned int)time(NULL)); CMap<int, int, int, int> cmap; hash_map<int, int> hmap; int tempnum[DATASET]; int query[QUERYNUM]; int exsit = 0; int j = 0; for (int i=0; i<DATASET; ++i) { // tempnum[i] = rand()%1000; tempnum[i] = rand(); } for (int i=0; i<QUERYNUM; ++i) { // query[i] = rand() + 1001; query[i] = rand(); } DWORD start; start = GetTickCount(); for (int i=0; i<DATASET; ++i) { cmap[tempnum[i]] = 1; } for (int i=0; i<QUERYNUM; ++i) { if (cmap.Lookup(query[i], j)) { exsit++; } } cmap.RemoveAll(); cout<<"Query Time"<<(double)(GetTickCount() - start)<<" :"<<exsit<<endl; exsit = 0; start = GetTickCount(); for (int i=0; i<DATASET; ++i) { hmap[tempnum[i]] = 1; } for (int i=0; i<QUERYNUM; ++i) { if (hmap.find(query[i]) != hmap.end()) { exsit++; } } hmap.clear(); cout<<"Query Time"<<(double)(GetTickCount() - start)<<" :"<<exsit<<endl; system("pause"); return 0; }
CMap与hash_map效率对比,布布扣,bubuko.com
原文:http://blog.csdn.net/woniu317/article/details/37560773