45

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?

HanXu
  • 5,507
  • 6
  • 52
  • 76

1 Answers1

55
#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.

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:

#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);
            });
}
yzt
  • 8,873
  • 1
  • 35
  • 44
zch
  • 14,931
  • 2
  • 41
  • 49
  • 9
    Or, write a make_unordered_hash templated function for type deduction. There is also actually a C++ proposal to more generally address this problem http://isocpp.org/files/papers/n3602.html – mmocny Apr 09 '13 at 14:05