在Stl Hash_map中查找键

时间:2010-12-10 09:09:48

标签: c++ stl hashmap

我是c ++的初学者,并且哈希表有些问题。我的程序需要哈希表结构。首先我使用boost unordered_map。它拥有我需要的所有东西,但它使我的程序如此缓慢。然后我想测试stl hash_map,但我不能做我需要的所有事情。这是我的第一个代码(这是样本)

#include <hash_map>
using namespace std;

struct eqstr
{
  bool operator()(int s1, int s2) const
  {
    return s1==s2;
  }
};
typedef stdext::hash_map< int, int, stdext::hash_compare< int, eqstr > > HashTable;

int main()
{
  HashTable a;
  a.insert( std::pair<int,int>( 1, 1 ) );
  a.insert( std::pair<int,int>( 2, 2 ) );
  a.insert( std::pair<int,int>( 4, 4 ) );
//next i want to change value of key 2 to 20
  a[2] =  20;
//this code only insert pair<2,20> into a, buy when I use boost unordered_map this code                         modify previous key of 2  
//next I try this code for delete 2 and insert new one
  a.erase(2);//this code does work nothing !!!
//next I try to find 2 and delete it
  HashTable::iterator i;
  i = a.find(2);//this code return end, and does not work!!!
  a.erase(i);//cause error
//but when I write this code, it works!!!
  i=a.begin();
  a.erase(i);
//and finally i write this code
  for (i = a.begin(); i!=a.end(); ++i)
  {
    if (i->first == 2 )
      break;
  }
  if (i!= a.end())
    a.erase(i);
//and this code work 

但如果我想搜索我的数据,我使用数组而不是hash_map,为什么我无法使用o(1)访问,修改和删除hash_map 我的错误是什么,我的程序的哈希结构很快,在初始化阶段有很多值修改。是谷歌sparse_hash适合我,如果是的话,可以给我一些教程。 谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

您可以查看:http://msdn.microsoft.com/en-us/library/525kffzd(VS.71).aspx

我认为stdext::hash_compare< int, eqstr >导致了这里的问题。尝试删除它。

哈希映射的另一个实现是std::tr1::unordered_map。但我认为各种哈希映射实现的性能类似。你能详细说明boost :: unordered_map有多慢吗?你是怎么用的?为什么?

答案 1 :(得分:0)

有很多不同类型的哈希映射,许多开发人员仍然自己编写,因为你可以更多地使用自己的特定用途获得更高的性能,而不是通用的,当人们想要真正的高性能时,他们倾向于使用哈希。

您需要考虑的第一件事是您真正需要做什么以及您真正需要多少性能,然后确定现成的东西是否能满足这一要求,或者您是否需要自己编写一些东西。

如果您从不删除元素,例如,只需编写一次然后不断查找,那么您通常可以重新进行以减少您获得的实际集合的冲突:在设置时更长但在查找时更快。

如果删除元素,则会出现编写自己的问题,因为它不足以“使”条目“空”,因为另一个可能已经将其作为其碰撞过程的一部分而已经过了你的现在如果你看起来那个一旦它击中你的空,就会放弃“未找到”。