我使用带有动态内存分配的自定义类的unordered_map作为键和值。我想知道如何有效地插入键,特别是找到与特定键相关的值。 让
*facebook*
其中
typedef std::unordered_map<Key,Node> Hashtable;
和Key有一个定制的哈希函数
class Key {
public:
int dimx;
int *l;
// allocate
void allocate(int dim){
l = new int[dim];
dimx = dim;
}
// ==
bool operator==(const Key &other) const
{
int j;
for(j = 0; j < dimx; j++){
if(l[j] != other.l[j]){
return 0;
}
}
return 1;
}
};
class Node {
public:
double *x, *f;
// allocate
void allocate(int dim){
x = new double[dim];
f = new double[dim];
}
};
然后我们可以通过
插入键和值template <class T>
inline void hash_combine(std::size_t & seed, const T & v)
{
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
namespace std
{
template <>
struct hash<Key>
{
std::size_t operator()(const Key& key) const
{
std::size_t seed = 0;
int j;
for(j = 0; j < key.dimx; j++){
hash_combine(seed,key.l[j]);
}
return seed;
}
};
}
根据密钥,我们可以通过以下方式找到一个节点:
int dim = 2
Hashtable *hashtable = new Hashtable;
Key *keya = new Key;
key->allocate(dim);
// set values of key
Node *nodea = new Node;
node->allocate(dim);
// set values of node
hashtable->insert(std::make_pair(*key,*node))
我已经分析了我的代码并得出结论,多次调用hashtable-&gt; find是最昂贵的部分。我可以更快地做点什么吗?应该是unorder_map,例如在指向类的指针方面?