gpt4 book ai didi

c++ - 在 unordered_set 中使用数组作为键

转载 作者:行者123 更新时间:2023-11-30 02:44:31 25 4
gpt4 key购买 nike

我想使用一个 unordered_setunsigned long long* 作为键,但我想实现 hashequal_to 使用存储的值。例如:

int size = 4;
typedef unsigned long long verylong;
verylong* x = new verylong[size];
// calc hash and equal using x[0]..x[3]

简单的方法是使用包装器。

class VeryLong {
verylong* array;
int arraySize;
...
bool operator==(const VeryLong& x) { // use the array and arraySize }
...
};
namespace std {

template <>
class hash<VeryLong>
{
std::size_t operator()(const VeryLong& v) const
{

// Compute hash values for array (using murmur, maybe)
//...
}
};

但由于内存消耗,我不想使用包装器。我想要这样的东西:

std::unordered_set<verylong*,MyHash,MyEqual> set;

问题是实现MyHashMyEqual,因为arraySize不是常量(我只知道执行时的arraySize)。

我试过这个:

typedef struct MyHash
{
int arraySize;
MyHash(int size) : arraySize(arraySize) {}
long operator() (const verylong* const k) const { return hash(k,size); }
} MyHash;

但我不能使用它,因为 MyHash 不是constexpr

我想做的可以吗?

编辑:如果我尝试使用上面实现的 MyHash:

int size;
// someone sets size a positive value
std::unordered_set<verylong*,MyHash(size),MyEqual> set;

出现以下错误:

错误:常量表达式 std::unordered_set set 中的临时非文字类型“MyHash”;

最佳答案

std::unordered_set<> 的第二个模板参数应该是 MyHash而不是 MyHash(size) ,因为这里期望的是类型,而不是对象。更改您的 set声明:

std::unordered_set<verylong*, MyHash, MyEqual> set(bucket_count, MyHash(size));

大概是MyEqual size 需要类似的参数,在这种情况下:

std::unordered_set<verylong*, MyHash, MyEqual> set(bucket_count, MyHash(size), MyEqual(size));

对于 bucket_count , 估计你的集合中有多少元素。

作为旁注,不要 typedef你的struct就是这样——这是一种在 C++ 中毫无用处的可怕的 C 主义。

关于c++ - 在 unordered_set 中使用数组作为键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25212372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com