在 C++ 中将参数传递给 unordered_set 哈希函数的语法
Syntax to pass argument to unordered_set hash function in c++
我已经为我正在使用的自定义类型创建了一个散列器 class,但它有一个接受参数的构造函数。我不知道在 unordered_set.
中使用它的语法
class Hasher {
unsigned arg;
public:
Hasher(unsigned a) : arg(a) {}
size_t operator()(const MyType& t) const {
return calculate_hash(arg, t);
}
}
int main() {
unordered_set<MyType, Hasher(2)> myset; // compilation error
}
错误信息:
In file included from Tetrahedron.cc:5:
./Triangulation.h:52:29: error: template argument for template type parameter must be a type
unordered_set<TetraFace,FaceHasher(2)> faces2;
^~~~~~~~~~~~~
/bin/../lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/unordered_set.h:90:11: note: template parameter is declared here
class _Hash = hash<_Value>,
^
我也试过了
unordered_set<MyType, Hasher> myset(Hasher(2));
但我仍然收到错误消息:
In file included from Tetrahedron.cc:5:
./Triangulation.h:52:59: error: expected ')'
unordered_set<TetraFace,FaceHasher> faces2(FaceHasher(2));
^
./Triangulation.h:52:58: note: to match this '('
unordered_set<TetraFace,FaceHasher> faces2(FaceHasher(2));
^
不幸的是,无法构造一个std::unorderd_set
with just the hash object. All of the constructors,它采用散列对象,在它之前有一个参数用于bucket_count
。您需要为其指定值
unordered_set<MyType, Hasher> myset(some_bucket_count_value, Hasher(2));
如果您不想这样做,那么您必须使 Hasher
默认可构建。
也不是那个
return calculate_hash(arg);
不会起作用,因为无论您通过什么 MyType
,您总是会散列 arg
。您需要散列 MyType
对象才能使 std::unordered_set
真正起作用。
你在那里遇到编译错误,因为你试图将类型为 Hasher 的对象(即实例)作为模板参数传递。
如您的错误描述:template argument for template type parameter must be a type
它需要一个类型,而您正在传递一个值。
在类型级别参数化 arg。
template<unsigned A>
class Hasher {
unsigned arg = A;
public:
size_t operator()(const int& t) const {
std::cout << arg << std::endl;
return 0;
}
};
int main() {
std::unordered_set<int, Hasher<2>> myset;
myset.insert(5); // prints 2
std::unordered_set<int, Hasher<3>> myset2;
myset2.insert(3); // prints 3
}
我已经为我正在使用的自定义类型创建了一个散列器 class,但它有一个接受参数的构造函数。我不知道在 unordered_set.
中使用它的语法class Hasher {
unsigned arg;
public:
Hasher(unsigned a) : arg(a) {}
size_t operator()(const MyType& t) const {
return calculate_hash(arg, t);
}
}
int main() {
unordered_set<MyType, Hasher(2)> myset; // compilation error
}
错误信息:
In file included from Tetrahedron.cc:5:
./Triangulation.h:52:29: error: template argument for template type parameter must be a type
unordered_set<TetraFace,FaceHasher(2)> faces2;
^~~~~~~~~~~~~
/bin/../lib/gcc/x86_64-redhat-linux/6.3.1/../../../../include/c++/6.3.1/bits/unordered_set.h:90:11: note: template parameter is declared here
class _Hash = hash<_Value>,
^
我也试过了
unordered_set<MyType, Hasher> myset(Hasher(2));
但我仍然收到错误消息:
In file included from Tetrahedron.cc:5:
./Triangulation.h:52:59: error: expected ')'
unordered_set<TetraFace,FaceHasher> faces2(FaceHasher(2));
^
./Triangulation.h:52:58: note: to match this '('
unordered_set<TetraFace,FaceHasher> faces2(FaceHasher(2));
^
不幸的是,无法构造一个std::unorderd_set
with just the hash object. All of the constructors,它采用散列对象,在它之前有一个参数用于bucket_count
。您需要为其指定值
unordered_set<MyType, Hasher> myset(some_bucket_count_value, Hasher(2));
如果您不想这样做,那么您必须使 Hasher
默认可构建。
也不是那个
return calculate_hash(arg);
不会起作用,因为无论您通过什么 MyType
,您总是会散列 arg
。您需要散列 MyType
对象才能使 std::unordered_set
真正起作用。
你在那里遇到编译错误,因为你试图将类型为 Hasher 的对象(即实例)作为模板参数传递。
如您的错误描述:template argument for template type parameter must be a type
它需要一个类型,而您正在传递一个值。
在类型级别参数化 arg。
template<unsigned A>
class Hasher {
unsigned arg = A;
public:
size_t operator()(const int& t) const {
std::cout << arg << std::endl;
return 0;
}
};
int main() {
std::unordered_set<int, Hasher<2>> myset;
myset.insert(5); // prints 2
std::unordered_set<int, Hasher<3>> myset2;
myset2.insert(3); // prints 3
}