I wonder if it is possible to use lambda function as custom hash function for unordered_map in C++11? If so, what is the syntax?
我想知道是否可以在c++ 11中使用lambda函数作为unordered_map的自定义哈希函数?如果是,语法是什么?
1 个解决方案
#1
45
#include<unordered_map>
#include<string>
int main() {
auto my_hash = [](std::string const& foo) {
return std::hash<std::string>()(foo);
};
std::unordered_map<std::string, int, decltype(my_hash)> my_map(10, my_hash);
}
You need to pass lambda object to unordered_map
constructor, since lambda types are not default constructible.
您需要将lambda对象传递给unordered_map构造函数,因为lambda类型不是默认的可构造的。
As @mmocny suggested in comment, it's also possible to define make function to enable type deduction if you really want to get rid of decltype
:
正如@mmocny在评论中建议的,如果你真的想要摆脱decltype,也可以定义make函数来启用类型演绎:
#include<unordered_map>
#include<string>
template<
class Key,
class T,
class Hash = std::hash<Key>
// skipped EqualTo and Allocator for simplicity
>
std::unordered_map<Key, T, Hash> make_unordered_map(
typename std::unordered_map<Key, T, Hash>::size_type bucket_count = 10,
const Hash& hash = Hash()) {
return std::unordered_map<Key, T, Hash>(bucket_count, hash);
}
int main() {
auto my_map = make_unordered_map<std::string, int>(10,
[](std::string const& foo) {
return std::hash<std::string>()(foo);
});
}
#1
45
#include<unordered_map>
#include<string>
int main() {
auto my_hash = [](std::string const& foo) {
return std::hash<std::string>()(foo);
};
std::unordered_map<std::string, int, decltype(my_hash)> my_map(10, my_hash);
}
You need to pass lambda object to unordered_map
constructor, since lambda types are not default constructible.
您需要将lambda对象传递给unordered_map构造函数,因为lambda类型不是默认的可构造的。
As @mmocny suggested in comment, it's also possible to define make function to enable type deduction if you really want to get rid of decltype
:
正如@mmocny在评论中建议的,如果你真的想要摆脱decltype,也可以定义make函数来启用类型演绎:
#include<unordered_map>
#include<string>
template<
class Key,
class T,
class Hash = std::hash<Key>
// skipped EqualTo and Allocator for simplicity
>
std::unordered_map<Key, T, Hash> make_unordered_map(
typename std::unordered_map<Key, T, Hash>::size_type bucket_count = 10,
const Hash& hash = Hash()) {
return std::unordered_map<Key, T, Hash>(bucket_count, hash);
}
int main() {
auto my_map = make_unordered_map<std::string, int>(10,
[](std::string const& foo) {
return std::hash<std::string>()(foo);
});
}