2012-06-06 29 views
5

में सेट करें एसटीएल एल्गोरिदम के साथ std :: set मानों को गहरी प्रतिलिपि बनाने के लिए एक std :: set पर संभव है?std :: map को std :: C++

मैं नए सेट में स्पष्ट रूप से सम्मिलित नहीं करना चाहता हूं।

मैं नहीं स्पष्ट रूप से ऐसा करने के लिए करना चाहते हैं :

std::map<int, double*> myMap; //filled with something 
std::set<double*> mySet; 

for (std::map<int, double*>::iterator iter = myMap.begin(); iter!=myMap.end(); ++iter) 
{ 
    mySet.insert(iter->second); 
} 

लेकिन एक और अधिक coincise और मूल्यों की गहरी प्रति के साथ ऐसा करने के लिए, सुरुचिपूर्ण रास्ता खोजने।

+0

कुछ कोड जोड़ें। क्या आप 'map' की' key_type' या 'value_type' की प्रतिलिपि बनाने का प्रयास कर रहे हैं? – dirkgently

+1

डुप्लिकेट होने पर क्या होगा? क्या आप इसके बजाय 'मल्टीसेट' का उपयोग कर रहे हैं? –

+0

कोई डुप्लिकेट नहीं होगा, और यदि वहां हैं, तो महत्वपूर्ण नहीं है। – linello

उत्तर

8

इसके बारे में क्या?

std::transform(myMap.begin(), myMap.end(), std::inserter(mySet, mySet.begin()), 
    [](const std::pair<int, double*>& key_value) { 
     return key_value.second; 
    }); 

यह केवल पॉइंटर्स की प्रतिलिपि बनाता है। यदि आप एक गहरे प्रतिलिपि चाहते हैं, तो आपको बस इतना करना होगा:

std::transform(myMap.begin(), myMap.end(), std::inserter(mySet, mySet.begin()), 
    [](const std::pair<int, double*>& key_value) { 
     return new double(*key_value.second); 
    }); 

Btw, कोड लैम्ब्डा कार्य (केवल से सी ++ 11 उपलब्ध है) का उपयोग करता है। यदि आप सी ++ 11 का उपयोग नहीं कर सकते हैं, तो आप function object का उपयोग कर सकते हैं।

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