2010-04-30 23 views
17

मैं एक std :: map की सामग्री को दूसरे में कॉपी करना चाहता हूं। क्या मैं इसके लिए std::copy का उपयोग कर सकता हूं? जाहिर है, निम्नलिखित कोड काम नहीं करेगा:मैं std :: copy का उपयोग करके एक मानचित्र को दूसरे में कैसे कॉपी कर सकता हूं?

int main() { 
    typedef std::map<int,double> Map; 
    Map m1; 
    m1[3] = 0.3; 
    m1[5] = 0.5; 
    Map m2; 
    m2[1] = 0.1; 
    std::copy(m1.begin(), m1.end(), m2.begin()); 
    return 0; 
} 

यह काम नहीं करेगा क्योंकि copym2.begin() पर operator* कॉल "भिन्नता" यह और एक मूल्य निर्दिष्ट (सभी मूल्यों प्रकार std::pair<const int, double> के हैं) होगा। फिर यह में अगली जगह पर जाने के लिए operator++ पर कॉल करेगा। में const की वजह से ये दोनों ऑपरेशन काम नहीं करते हैं और किसी भी नए तत्व के लिए आरक्षित कोई स्थान नहीं है।

क्या यह std::copy के साथ काम करने का कोई तरीका है?

धन्यवाद!

std::copy(m1.begin(), m1.end(), std::inserter(m2, m2.end())); 

inserter<iterator> में परिभाषित किया गया है:

उत्तर

59

आप जीएमएन के उत्तर का उपयोग कर सकते हैं --- लेकिन सवाल यह है कि क्यों क्या आप std::copy का उपयोग करना चाहते हैं? आपको इसके बजाय सदस्य फ़ंक्शन std::map<k, v>::insert का उपयोग करना चाहिए।

m2.insert(m1.begin(), m1.end()); 
+1

+1 वास्तव में, बहुत साफ है। – GManNickG

+1

ठीक है, अगर आप std :: प्रतिलिपि का उपयोग करने से बचने वाले हैं, तो क्यों न केवल कॉपी c'tor का उपयोग करें? एम 2 = एम 1। संपादित करें: आह, वह मूल्यों का संघ चाहता है। – Stephen

+2

@ स्टीफन: क्योंकि 'डालने' का उपयोग करके 'm2' के अंदर मौजूदा सामग्री को संरक्षित करता है। प्रतिलिपि * असाइनमेंट * ऑपरेटर का उपयोग मौजूदा सामग्री को 'm2' के अंदर नष्ट कर देता है। –

19

आप एक insert iterator का एक संस्करण की आवश्यकता है। इसके लिए एक जगह की आवश्यकता होती है (इसलिए m2.end()), और insert_iterator देता है।

+5

सही उत्तर के लिए +1, लेकिन किसी को एल्गोरिदम कॉल के लिए सदस्य फ़ंक्शंस को प्राथमिकता देना चाहिए। –

+0

+1 @GMan, +1 @ बिली, आप दोनों को यह सही मिला। ओपी को बिली सुझाव देना चाहिए, लेकिन वास्तव में जीएमएन ने सवाल का जवाब दिया। तो, अपनी शक्तियों के साथ संयुक्त ... – wilhelmtell

+5

@ विल्हेल्मटेल: मैं कैप्टन प्लान हूँ! – GManNickG

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

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