读书人

hash_地图的遍历

发布时间: 2013-07-04 11:45:33 作者: rapoo

hash_map的遍历
我这有段代码和注释了的代码
都是执行相同目的的操作:遍历删除自己。(我就是要遍历...不要说用clear)

你直觉认为谁更快吗?为什么呢?


#define _SECURE_SCL 0
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <sstream>
#include <iomanip>
#include <hash_map>
#include "windows.h"
using namespace std;
using stdext::hash_map;
void main()
{

hash_map<string,int> hm;
list<string> lst;
for (int i = 0; i < 30000; ++i)
{
stringstream ss;
ss<<setw(20)<<setfill('0')<<i;
lst.push_back(ss.str());
hm.insert(make_pair(ss.str(),i));
}

DWORD dwtickbeg = GetTickCount();

for (list<string>::iterator iter = lst.begin(); iter != lst.end(); ++iter)
{
hm.erase(*iter);
}
DWORD dwEnd = GetTickCount() - dwtickbeg;

//hash_map<string,int> hm;
//for (int i = 0; i < 30000; ++i)
//{
//stringstream ss;
//ss<<setw(20)<<setfill('0')<<i;
//hm.insert(make_pair(ss.str(),i));
//}

//DWORD dwtickbeg = GetTickCount();

//hash_map<string,int>::iterator iter = hm.begin();
//while (iter != hm.end())
//{
//iter= hm.erase(iter);
//}
//DWORD dwEnd = GetTickCount() - dwtickbeg;
cout<<dwEnd<<" "<<hm.size()<<endl;
system("pause");
return;
}



[解决办法]
说的就是不是同一份。你遍历lst,然后用lst的元素去调用hash_map的erase。业务上是两种逻辑。

光看erase的话,erase(key)版本最终调用的还是erase(iter)版本。但整体代码中,iter版的代码里有的操作比key的复杂,所以就慢了
[解决办法]
代码是没有问题的

效率差异的根本还是得看 hash_map源码实现

而且不同的stl实现甚至是版本差异也可能会有不同的效率表现

感觉把时间放在这上面,不是很值。

[解决办法]
要看hashmap的底层是怎么实现的。这里我猜是桶长的原因,因为迭代操作要遍历整个桶长,不管里面有没有数据,而你通过key来删除只需要遍历有数据的桶,在这里你有3W个数据,要是桶长有8w。直接遍历肯定要慢很多啊。

读书人网 >C++

热点推荐