2014-12-18 7 views
5

मैं std::map कंटेनर ऑब्जेक्ट को दूसरे स्थान पर ले जाना चाहता हूं। सरलतम रूप में:एक एसटीएल कंटेनर ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट में कैसे कॉपी/कॉपी करें जब उसका मान प्रतिलिपि बनाने योग्य नहीं है उदा। std :: thread

#include<map> 
#include<thread> 
#include<vector> 
using namespace std; 

int main() 
{ 
    map<void*, vector<thread>> m1, m2; 
    // m1 is updated 

    m1.insert(m2.begin(), m2.end()); // <--- problem here 
    m2.clear(); // not required anymore 
} 

हालांकि यह error के एक पृष्ठ देता है:

error: use of deleted function ‘std::thread::thread(const std::thread&)’ 

यह कैसे पूरा करने के लिए?

+1

ठीक है, आप धागे कॉपी नहीं कर सकते। मेरे पास एकमात्र सुझाव है 'नक्शा <शून्य *, वेक्टर >> '(या' नक्शा <शून्य *, shared_ptr <वेक्टर >> ', जो भी अधिक उपयुक्त लगता है)। – Wintermute

+0

जो आप पूछ रहे हैं वह वास्तव में समझ में नहीं आता है - धागे की प्रतिलिपि बनाने का क्या अर्थ है? क्या आप इसके बजाय इसे स्थानांतरित करना चाहते हैं? – Cameron

+0

@ कैमरॉन, हां वास्तव में यह चल रहा है। उसके बाद मैं 'm2.clear()' चलाऊंगा। – iammilind

उत्तर

11

std::thread है नहीं कॉपी-constructible, आप एक इटरेटर कि चाल की अनुमति देता है का उपयोग करना होगा कक्षा std::move_iterator जिसका एक्सेस सदस्य (operator*() और operator->()) अंतराल के विपरीत संदर्भों को संदर्भित करता है जो कि अंतराल में लौटते हैं। map::insert() अपने ऑपरेशन को map::emplace() पर भेजता है जहां यह तत्व प्रकार में तर्क को आगे बढ़ाता है।

आपके धागे की प्रति-रचनाकारों को बुलाया जा रहा था क्योंकि बिल्ट-इन इटरेटर्स से लौटाई गई वस्तुओं को lvalues ​​ के रूप में अग्रेषित किया जा रहा था और इस प्रकार कॉपी किया गया था।

1

सामान्य समाधान: इसे स्थानांतरित करें।

हालांकि, std::move() एक ही मूल्य को स्थानांतरित कर सकता है, यह मानों की एक श्रृंखला को स्थानांतरित नहीं कर सकता है। आप एक पाश लिखने के लिए की आवश्यकता होगी:

for (auto&& pair : m1) m2[pair.first] = std::move(pair.second) 
2

मुझे नहीं लगता कि आप तत्व है जो केवल चल रहे हैं की एक श्रृंखला को सम्मिलित करने में सक्षम हो जाएगा। आप अलग-अलग तत्वों std::move() करने में सक्षम है, हालांकि होना चाहिए:

m1.insert(std::make_move_iterator(m2.begin()), 
      std::make_move_iterator(m2.end()); 

std::make_move_iterator एक विशेष इटरेटर रिटर्न:

for (auto& element: m2) { 
    m1.emplace(element.first, std::move(element.second)); 
} 
+0

इसके विपरीत, 'std :: make_move_iterator' है। लेकिन यह निश्चित रूप से एक प्रतिलिपि के रूप में समान रूप से समान नहीं है। – Cameron

3
उन्हें ले जाएँ

, चाल iterators का उपयोग कर:

m1.insert(make_move_iterator(begin(m2)), make_move_iterator(end(m2))); 
5

बस पूर्णता के लिए, वहाँ एक अल्पज्ञात कि std::copy लिए एक समान पद्धति का अनुसरण करता <algorithm> में std::move का संस्करण है।

तो आप इस लिख सकते हैं:

move(begin(m2), end(m2), inserter(m1, begin(m1))); 
m2.clear(); 

reference here

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

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