hash_map,复合键的映射哈希函数

时间:2011-06-17 17:41:19

标签: c++ stl cstring

我有一个工作的std :: map类,这有点慢,所以我想尝试其他数据结构

我的密钥是一个复合数据类型,如

typedef struct {
  char * name;
  int offset;
}position;

对于std :: map我正在使用以下部分排序函数

struct cmp_position {
  bool operator()(const position& first,const  position& second) {
    int tmp = std::strcmp(first.name, second.name);
    if(tmp!=0)
      return tmp<0;
    else
      return first.offset<second.offset;
  }
};

我的地图定义是

typedef std::map<position,int,cmp_position> myMap;

我一直在看__gcc_ext :: hash_map,这需要一个可以简单的

的相等函数
struct positionEq
{
  bool operator()(const position& s1, const position & s2) const
  {
    return strcmp(s1.name, s2.name) == 0 && (s1.offset==s2.offset) ;
  }
};

哪个应该有用,但是我的复合类型的哈希函数遇到了麻烦。 我想我可以做点像

position s;
char buf[100];
snprintf(buf,100,"%s:%d\n",s.name,s.offset);

但我在将它粘在一起时遇到了问题。

实际上地图和哈希映射可能有点矫枉过正,因为我没有使用键的值,我只是使用我的地图来检查存在。

我打算不使用std :: strings。

由于

编辑:

在上面的例子中,我尝试使用std :: set而不是std :: map,并且std :: set在填充和查找条目时始终较慢。虽然整体比较如下表所示,但它使用的内存要少得多。我尝试每次运行10次

         Set        map
 size   1.8gig     3.1gig
 pop    <15sec     <14sec
 find   <12sec     <9sec 

我使用了超过34个条目的数据集,在填充数据结构后,我尝试查找所有34个mio元素。我猜结论是,除了节省内存之外,std :: set是劣等的。

1 个答案:

答案 0 :(得分:0)

您是否尝试使用存储散列值name的密钥结构(例如,使用boost::hash_value) - 因此比较关键对象只是两个数字比较,这应该非常快。

尝试使用unordered_set进行测试。 boost::multi_index_container声称表现优于std::set等等,在某些情况下,您可以看到这是否会加速一些事情(请参阅我的回答here以获取其使用示例)。