2012-04-10 19 views
11

मैं सोच रहा हूँ अगर वहाँ एक दूसरे को काटना या दो संरचनाओं std::set<MyData*> रूप में परिभाषित किया और मानक एल्गोरिदम के साथ std::map<MyData*, MyValue> (std::set_intersect की तरह)क्या std :: map और std :: set intersect/diff करने का कोई तरीका है?

समस्या यह है कि मैं सेट और के बीच अंतर की गणना करने की जरूरत है के बीच मतभेद बनाने के तरीके मानचित्र की कीसेट लेकिन मैं इसे पुन: आवंटित करने से बचना चाहूंगा (क्योंकि यह ऐसा कुछ है जो बड़े डेटा संरचनाओं के साथ प्रति सेकंड कई बार किया जाता है)। std::map का "मुख्य दृश्य" प्राप्त करने का कोई तरीका है? जो कुछ भी मैं देख रहा हूं उसके बाद केवल कार्यान्वयन बिंदु से सेट ऑपरेशन करते समय केवल चाबियों पर विचार करना है, यह संभव होना चाहिए लेकिन मुझे कुछ भी नहीं मिला है। आदेश दिया संग्रह पर

#include <algorithm> 
#include <iostream> 
#include <map> 
#include <iterator> 
#include <string> 
#include <set> 
#include <vector> 

#include <boost/iterator/transform_iterator.hpp> 

typedef std::map<std::string, int> map_t; 
typedef std::set<std::string> set_t; 

const map_t::key_type & getKey(const map_t::value_type & pair) 
{ 
    return pair.first; 
} 

typedef const map_t::key_type & (*getKey_t)(const map_t::value_type &); 

typedef boost::transform_iterator<getKey_t, map_t::iterator> key_iterator_t; 

int main() 
{ 
    map_t map; 
    map["a"]=1; map["b"]=2; 
    set_t set; 
    set.insert("a"); set.insert("c"); 

    std::vector<std::string> v; 

    std::set_intersection(set.begin(), set.end(), 
     key_iterator_t(map.begin(), getKey), 
     key_iterator_t(map.end(), getKey), 
     std::back_inserter(v)); 
    std::copy(v.begin(), v.end(), 
     std::ostream_iterator<std::string>(std::cout," , ")); 
} 
+0

बूस्ट इटरेटर लाइब्रेरी में filter_iterator पर एक नज़र डालें। –

+1

क्षमा करें, फ़िल्टर_इटरेटर नहीं - transform_iterator। बेनामी 'उत्तर देखें। –

उत्तर

8

आपको std::map इटरेटर अनुकूल करने के लिए और केवल चाबियाँ लौटने के लिए में बढ़ावा से transform_iterator उपयोग कर सकते हैं। आप एक कस्टम इटरेटर लिख सकते हैं जो मानक मानचित्र इटरेटर को लपेटता है और कुंजी देता है। इसके बाद आप इसका उपयोग set_intersect

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