首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

hash_地图的遍历

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

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。直接遍历肯定要慢很多啊。

热点排行