2015-10-24 6 views
5

मैं निम्नलिखित टेम्पलेट समारोह है कि बदली कुंजी और मूल्यों के साथ दिया नक्शे की एक प्रति रिटर्न दिया है:दोनों std :: नक्शे और std :: unordered_map के साथ एक टेम्पलेट काम करना

template<typename M> 
auto swapKeysAndValues(const M& m) { 
    std::map<typename M::mapped_type, typename M::key_type> swapped; 
    for (auto& p : m) { 
     swapped.emplace(p.second, p.first); 
    } 
    return swapped; 
} 

वहाँ का एक तरीका है उपरोक्त टेम्पलेट को std::map और std::unordered_map दोनों के लिए काम करना? यही है, std::map<K, V> के लिए, इसे std::map<V, K>, और std::unordered_map<K, V> पर वापस जाना चाहिए, इसे std::unordered_map<V, K> वापस करना चाहिए।

उत्तर

4
template<template <typename...> class Map, typename K, typename V> 
auto swapKeyValues(const Map<K, V>& map) 
{ 
    Map<V, K> result; 
    for (const auto& p : map) result.emplace(p.second, p.first); 
    return result; 
} 

Live example

+1

एक अच्छी शुरुआत है, लेकिन आवंटकों, हैश कार्यों और तुलना के बारे में क्या भविष्यवाणी करता है? –

+0

@ रिचर्डहोजेज मानक भविष्यवाणी/हैश/आवंटक वाले मानचित्रों के साथ ही काम करता है ... यह कहना मुश्किल है कि कौन सा तुलनित्र उपयोग किया गया था। – ForEveR

+1

सहमत हैं। मुझे लगता है कि एक सही समाधान में शामिल जटिलता समाधान से समस्या को और जटिल बनाती है। यह शायद एक समारोह नहीं है जिसे परिभाषित किया जाना चाहिए। –

1

यहाँ जवाब के एक जोड़े तो मैं पुराने जमीन को कवर करने नहीं जा रहा हूँ रहे हैं।

हालांकि इसका एक पहलू है कि आपको ध्यान से विचार करना चाहिए।

अनियंत्रित नक्शे नक्शे के समान नहीं हैं - उनके पास आवश्यकता है कि कुंजी के लिए हैश फ़ंक्शन मौजूद है (समानता पूर्वानुमान के अतिरिक्त)। जैसा कि हमने देखा है, एक टेम्पलेट फ़ंक्शन लिखना तुच्छ है जो डिफ़ॉल्ट मानता है, लेकिन क्या आप चाहते हैं?

यदि आपके के और वी दोनों में हैश फ़ंक्शन उपलब्ध हैं, तो वे पहले से ही कुंजी हैं। उस स्थिति में, क्या आप वास्तव में boost::bimap या boost::multi_index_map चाहते थे?

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