परिचय: वेक्टर क्यों जोड़ें और यह मुश्किल क्यों है?
\n\nनमस्ते, साथी! यदि आपने कभी C++ में डेटा सूचियों को संसाधित करने वाला कोड लिखा है, तो आपने निश्चित रूप से इस कार्य का सामना किया होगा: "मेरे पास दो std::vector हैं, उनसे एक कैसे बनाऊं?" यह प्रश्न Stack Overflow पर एक वास्तविक हिट है (हजारों व्यूज!), और यह व्यर्थ नहीं है। पहली नज़र में ऐसा लगता है: इसमें मुश्किल क्या है? Python की तरह vector1 + vector2? लेकिन ऐसा नहीं है। C++ में, वेक्टर के लिए ऑपरेटर + परिभाषित नहीं है। हमें उपाय निकालना होता है।
आज हम दो std::vectors को जोड़ने के बारे में विस्तार से जानेंगे। मैं आपको 3 सिद्ध तरीके दिखाऊंगा, समझाऊंगा कि कब किसका उपयोग करना है, और उन गलतियों से आगाह करूंगा जिनमें अनुभवी डेवलपर्स भी फंस जाते हैं। चलिए शुरू करते हैं!
\n\nतरीका नंबर 1: insert() — क्लासिक तरीका
\n\nसबसे स्पष्ट और अक्सर इस्तेमाल की जाने वाली विधि insert() विधि है। यह एक वेक्टर के सभी तत्वों को दूसरे वेक्टर के अंत में सम्मिलित करने की अनुमति देती है। सिंटैक्स सरल और सुरुचिपूर्ण है:
#include <iostream>\n#include <vector>\n\nint main() {\n std::vector<int> vec1 = {1, 2, 3};\n std::vector<int> vec2 = {4, 5, 6};\n\n // जोड़ना: vec2 को vec1 के अंत में डालें\n vec1.insert(vec1.end(), vec2.begin(), vec2.end());\n\n // आउटपुट: 1 2 3 4 5 6\n for (int v : vec1) std::cout << v << " ";\n return 0;\n}\n\nयह कैसे काम करता है: हम कंपाइलर से कहते हैं: "स्थिति vec1.end() से शुरू करते हुए (अर्थात पहले वेक्टर के अंतिम तत्व के बाद), vec2.begin() और vec2.end() के बीच जो कुछ भी है उसे कॉपी करो।" बस — C++ में वेक्टर का संयोजन हो गया।
insert() के फायदे और नुकसान
\n- \n
- ✅ फायदे: सरलता, पठनीयता, किसी भी प्रकार के साथ काम करता है। \n
- ❌ नुकसान: यदि
vec1छोटा है औरvec2बहुत बड़ा है, तो सम्मिलन के दौरान कई बार मेमोरी पुनः आवंटन हो सकता है। यह बड़ी मात्रा में वेक्टर कॉन्केटनेशन के प्रदर्शन को कम करता है। \n
सुझाव: यदि आप अंतिम आकार जानते हैं, तो पहले से vec1.reserve(vec1.size() + vec2.size()) कॉल करें। यह अनावश्यक आवंटन से बचाएगा।
तरीका नंबर 2: std::merge() — क्रमबद्ध डेटा के लिए
\n\nक्या होगा यदि आपके वेक्टर पहले से क्रमबद्ध हैं? या आपको केवल जोड़ना नहीं, बल्कि एक एकीकृत क्रमबद्ध सरणी प्राप्त करनी है? तब <algorithm> हेडर फ़ाइल से std::merge एल्गोरिदम मंच पर आता है।
#include <iostream>\n#include <vector>\n#include <algorithm> // std::merge के लिए\n\nint main() {\n std::vector<int> vec1 = {1, 3, 5};\n std::vector<int> vec2 = {2, 4, 6};\n std::vector<int> result;\n\n // अनावश्यक कॉपी से बचने के लिए जगह आरक्षित करें\n result.reserve(vec1.size() + vec2.size());\n\n // दो क्रमबद्ध श्रेणियों को मर्ज करें\n std::merge(vec1.begin(), vec1.end(),\n vec2.begin(), vec2.end(),\n std::back_inserter(result));\n\n // आउटपुट: 1 2 3 4 5 6\n for (int v : result) std::cout << v << " ";\n return 0;\n}\n\nध्यान दें: std::merge के लिए आवश्यक है कि दोनों इनपुट श्रेणियां आरोही क्रम में क्रमबद्ध हों। यदि ऐसा नहीं है, तो परिणाम अप्रत्याशित होगा। लेकिन यदि डेटा क्रमबद्ध है, तो यह विधि प्रदर्शन की राजा है: जटिलता O(n + m)।
std::merge का उपयोग कब करें?
\n- \n
- यदि आप दो SQL क्वेरी या समय के अनुसार क्रमबद्ध लॉग के परिणामों को मिला रहे हैं। \n
- जब आपको केवल दो std::vectors को जोड़ना नहीं, बल्कि विशेष रूप से क्रमबद्ध विलय की आवश्यकता हो। \n
- यदि मूल वेक्टर को बदला नहीं जा सकता (हम तीसरा वेक्टर
resultबनाते हैं)। \n
तरीका नंबर 3: Move semantics — C++11 और नए के लिए गति
\n\nमान लीजिए, आपको मूल वेक्टर की आवश्यकता नहीं है