2012-03-19 26 views
25

अगर मैं दो वैक्टर हैं और उन्हें एक के लिए संयोजित करना चाहते हैं, मैं इसे नीचे दिए तरीक़े कर सकते हैं:"ले जाने के" दो वैक्टर एक साथ

std::vector<T> a(100); // just some random size here 
std::vector<T> b(100); 

a.insert(std::end(a), std::begin(b), std::end(b)); 

नकल शामिल है यही कारण है कि हालांकि, जो मैं बचना चाहते हैं। क्या उन्हें एक साथ लाने के लिए चाल-अर्थशास्त्र का उपयोग करने का कोई तरीका है?
मुझे अत्यधिक संदेह है, क्योंकि vector को संगत माना जाना चाहिए। हालांकि deque के साथ ऐसा करने का कोई तरीका है? वैकल्पिक रूप से

#include <algorithm> 
std::move(b.begin(), b.end(), std::back_inserter(a)); 

, आप इस कदम iterators उपयोग कर सकते हैं:

उत्तर

48

हाँ, std::move का उपयोग

a.insert(a.end(), 
     std::make_move_iterator(b.begin()), std::make_move_iterator(b.end())); 

दोनों ही मामलों में #include <iterator> के लिए याद रखें, और शुरू करने से पहले, कहते हैं:

a.reserve(a.size() + b.size()); 

जांच और वृद्धि की तुलना में मूल्य-प्रारंभिकता की लागत के आधार पर आकार काउंटर में, निम्नलिखित संस्करण भी दिलचस्प हो सकता है:

std::size_t n = a.size(); 
a.resize(a.size() + b.size()); 
std::move(b.begin(), b.end(), a.begin() + n); 
+0

धन्यवाद, अब मुझे पता है कि cppreference पर 'std :: move' के दो संस्करण क्यों हैं। मैंने हमेशा सोचा कि यह एक बग था और दूसरे संस्करण की जांच नहीं की। – inf

+3

मैंने पूरी तरह से याद किया था कि 'चाल' भी एक एल्गोरिदम था। – bames53

+0

@ bames53 मुझे वही खुशी है, लेकिन सुनने के बाद, यह पूरी तरह से समझ में आता है क्योंकि 'प्रतिलिपि' भी है। – inf

7

बिल्कुल वही निर्भर करता है जो आप स्थानांतरित करना चाहते हैं। जब आप एक वेक्टर ले जाते हैं, तो यह आंतरिक सरणी सूचक को प्रभावी रूप से स्वैप करके किया जाता है। तो आप पहले एक और वेक्टर के स्वामित्व वाली सरणी में एक वेक्टर पॉइंट बना सकते हैं।

लेकिन यह आपको दो वैक्टरों को मर्ज करने नहीं देगा।

std::move(b.begin(), b.end(), std::back_inserter(a)); 

फिर, यह वेक्टर के माध्यम से पुनरावृति जाएगा और लक्ष्य वेक्टर के लिए हर तत्व के लिए कदम:

सबसे अच्छा आप तो कर सकते हैं के रूप में Kerrek के जवाब में दिखाया गया है, हर व्यक्ति के सदस्य तत्व स्थानांतरित करने के लिए है।

+0

एक प्रश्न, हालांकि यह क्या अंतर करता है? क्या हम अनिवार्य रूप से वस्तुओं को बी में पदों में कॉपी नहीं कर रहे हैं? क्या यह वही काम नहीं करेगा जैसा कि ओप के सवाल में डाला गया है? – nnrales

+0

मुझे लगता है कि यदि वस्तुओं में जटिल हैं, तो उनकी प्रतिलिपि ctors नहीं कहा जाएगा, बस एक स्मृति प्रतिलिपि? – nnrales

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

  • कोई संबंधित समस्या नहीं^_^