2013-03-30 7 views
28

मुझे आश्चर्य है कि सी ++ 11 में unordered_map के लिए लैम्ब्डा फ़ंक्शन का कस्टम हैश फ़ंक्शन के रूप में उपयोग करना संभव है? यदि हां, तो वाक्यविन्यास क्या है?unordered_map में हैश फ़ंक्शन के रूप में लैम्ब्डा फ़ंक्शन का उपयोग कैसे करें?

+0

तुम क्या करने की कोशिश की है? लैम्ब्डा को पास करने की आवश्यकता है, या एक वैरिएबल है जो लैम्ब्डा – Ajay

+0

@Ajay रखता है, मैंने कोशिश की, लेकिन कुछ अजीब त्रुटियां हमेशा होती हैं ... अब मुझे पता है कि यह कैसे करें ... – HanXu

उत्तर

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

आप के बाद से लैम्ब्डा प्रकार constructible डिफ़ॉल्ट नहीं कर रहे हैं, unordered_map निर्माता को लैम्ब्डा वस्तु पारित करने के लिए की जरूरत है।

@mmocny टिप्पणी में सुझाव दिया गया है, यह भी संभव प्रकार कटौती सक्षम करने के लिए कर समारोह को परिभाषित करने के लिए क्या तुम सच में 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); 
      }); 
} 
+0

ठीक है, बहुत बहुत धन्यवाद। – HanXu

+9

या, कटौती के लिए make_unordered_hash टेम्पलेटेड फ़ंक्शन लिखें। वास्तव में इस समस्या को हल करने के लिए एक सी ++ प्रस्ताव भी है http://isocpp.org/files/papers/n3602.html – mmocny

संबंधित मुद्दे