我有一个工作的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是劣等的。
答案 0 :(得分:0)
您是否尝试使用存储散列值name
的密钥结构(例如,使用boost::hash_value
) - 因此比较关键对象只是两个数字比较,这应该非常快。
尝试使用unordered_set
进行测试。 boost::multi_index_container
声称表现优于std::set
等等,在某些情况下,您可以看到这是否会加速一些事情(请参阅我的回答here以获取其使用示例)。