2013-03-30 30 views
28

C++ 11'deki unordered_map için özel hash işlevi olarak lambda işlevinin kullanılması mümkün mü acaba? Eğer öyleyse, sözdizimi nedir? lambda tipleri constructible varsayılan olmadığı içinUnordered_map'de hash işlevi olarak lambda işlevi nasıl kullanılır?

+0

Ne denedi: @mmocny yorumunda önerildiği gibi gerçekten decltype kurtulmak istiyorsanız

, bu tip kesinti sağlamak için yapmak fonksiyonunu tanımlamak da mümkündür? Sadece lambda, veya bir lambda – Ajay

+0

@Ajay tutan bir değişkeni geçmek gerekiyor, denedim, ama bazı garip hataları her zaman oluşur ... şimdi nasıl yapılacağını biliyorum ... – HanXu

cevap

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

Sen unordered_map kurucusuna lambda nesneyi geçmesi gerekiyor.

#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

Tamam, çok teşekkür ederim. – HanXu

+9

Ya da tür kesintisi için make_unordered_hash templated işlevini yazın. Daha genel olarak bu soruna hitap eden bir C++ önerisi de var http://isocpp.org/files/papers/n3602.html – mmocny

İlgili konular