Подтвердить что ты не робот

Как использовать лямбда-функцию в качестве хэш-функции в unordered_map?

Интересно, можно ли использовать функцию лямбда как пользовательскую хеш-функцию для unordered_map в С++ 11? Если да, то какой синтаксис?

4b9b3361

Ответ 1

#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); 
}

Вам нужно передать лямбда-объект в конструктор unordered_map, поскольку типы лямбда не являются конструктивными по умолчанию.

Как @mmocny, предлагаемый в комментарии, также можно определить функцию make, чтобы включить вывод типа, если вы действительно хотите избавиться от decltype:

#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);
            });
}