2011-10-09 11 views
5

तो मेरे पास 2 std::map एस <string, shared_ptr<file> > एक 'पुराना' है 'नया' मैं कौन सी फाइलें प्राप्त करना चाहता हूं हटा दिए गए थे और इसलिए फेंकने वाले differene को फिर से चलाने में सक्षम हो और साझा_ptr में कुछ सामान करें। क्या ऐसी चीज संभव है और इसे कैसे करें?मैप कुंजी की एक सूची को दूसरे से कैसे घटाएं और नया नक्शा प्राप्त करें (नक्शा ए - मैब बी = मैप सी)

+2

'' 'std :: set_difference''' पर एक नज़र डालें। –

उत्तर

9

हालांकि इसे लिखने में काफी आसान है (A से अधिक सक्रिय करें और जांचें कि कुंजी B में मौजूद है या नहीं), यह std::set_difference के लिए नौकरी की तरह दिखता है। हम एक लैम्ब्डा या कुंजियों तुलना करने के लिए कुछ कस्टम विधेय, हालांकि की आवश्यकता होगी:

#include <iterator> 
#include <map> 
#include <string> 
#include <algorithm> 

typedef std::map<std::string, MyPtr> my_map; 

my_map A; // given 
my_map B; // given 

void make_a_difference() 
{ 
    my_map C; // will hold the result 

    std::set_difference(A.begin(), A.end(), 
         B.begin(), B.end(), 
         std::insert_iterator<my_map>(C, C.end()), 
       [](const my_map::value_type & a, const my_map::value_type & b) 
       { return a.first < b.first; } 
        ); 
} 

आप स्वयं वह लिखना चाहते हैं, तो आप इस तथ्य है कि दोनों सीमाओं को पहले से ही हल कर रहे हैं का लाभ लेने पर विचार करना चाहिए, तो आप कर सकते हैं समांतर में दो पुनरावृत्तियों को आगे बढ़ाकर अस्तित्व के लिए एक फ्लैट खोज से बेहतर।

आप सी ++ 11 की जरूरत नहीं है, बस लैम्ब्डा के बजाय इस विधेय का उपयोग करें:

bool my_comp(const my_map::value_type & a, const my_map::value_type & b) 
{ 
    return a.first < b.first; 
} 

खबरदार मैप किया प्रकार पर कोई तुलना नहीं है! तो यदि आपके पास दोनों मानचित्रों में एक ही स्ट्रिंग कुंजी है, तो परिणाम में ऐसी कोई वस्तु नहीं होगी, भले ही दो मैप किए गए मान अलग-अलग हों। यदि यह अवांछनीय है, तो आपको एक अलग आउटपुट कंटेनर की आवश्यकता है (उदा। std::multimap<my_map::key_type, my_map::mapped_type>) और एक अलग भविष्यवाणी।

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