如何在unordered_map中使用lambda函数作为哈希函数?

问题描述 投票:0回答:2

我想知道是否可以使用 lambda 函数作为 C++11 中 unordered_map 的自定义哈希函数?如果是的话,语法是什么?

c++ c++11
2个回答
57
投票
#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); 
}

您需要将 lambda 对象传递给

unordered_map
构造函数,因为 lambda 类型不可默认构造。

正如@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);
            });
}

0
投票

自 C++20 起,无状态 lambda 可以在未计算的上下文中使用。这意味着您可以直接使用

decltype
传递它,而无需声明和初始化任何变量,如下所示:

unordered_set<int, decltype([](auto const& foo) {...})> container;

或使用类型别名(例如,这可能有助于避免一些代码重复):

using hash_lambda = decltype([](auto const& foo){...});
unordered_set<int, hash_lambda> container;
© www.soinside.com 2019 - 2024. All rights reserved.