ब्रैडगोनसर्फिंग के उत्तर की दिशा में, कई बार एक को वास्तव में दो वैक्टर (ओ (एन)) को बदलने की आवश्यकता नहीं होती है, लेकिन इसके बजाय बस उनके साथ काम करें जैसे कि वे (ओ (1)) । यदि यह आपका मामला है, तो इसे बूस्ट लाइब्रेरी की आवश्यकता के बिना किया जा सकता है।
चाल एक वेक्टर प्रॉक्सी बनाने के लिए है: एक आवरण वर्ग जो दोनों वैक्टरों के संदर्भों में हेरफेर करता है, बाहरी रूप से एकल, सन्निहित के रूप में देखा जाता है।
उपयोग
std::vector<int> A{ 1, 2, 3, 4, 5};
std::vector<int> B{ 10, 20, 30 };
VecProxy<int> AB(A, B); // ----> O(1). No copies performed.
for (size_t i = 0; i < AB.size(); ++i)
std::cout << AB[i] << " "; // 1 2 3 4 5 10 20 30
कार्यान्वयन
template <class T>
class VecProxy {
private:
std::vector<T>& v1, v2;
public:
VecProxy(std::vector<T>& ref1, std::vector<T>& ref2) : v1(ref1), v2(ref2) {}
const T& operator[](const size_t& i) const;
const size_t size() const;
};
template <class T>
const T& VecProxy<T>::operator[](const size_t& i) const{
return (i < v1.size()) ? v1[i] : v2[i - v1.size()];
};
template <class T>
const size_t VecProxy<T>::size() const { return v1.size() + v2.size(); };
मुख्य लाभ
इसे बनाने के लिए O (1) (निरंतर समय) और न्यूनतम अतिरिक्त मेमोरी आवंटन है।
कंसीडर के लिए कुछ STUFF
- आपको केवल इसके लिए जाना चाहिए यदि आप वास्तव में जानते हैं कि आप संदर्भों के साथ क्या कर रहे हैं । यह समाधान किए गए प्रश्न के विशिष्ट उद्देश्य के लिए अभिप्रेत है, जिसके लिए यह बहुत अच्छा काम करता है । इसे किसी अन्य संदर्भ में नियोजित करने के लिए अप्रत्याशित व्यवहार हो सकता है यदि आप सुनिश्चित नहीं हैं कि संदर्भ कैसे काम करते हैं।
- इस उदाहरण में, एबी नहीं है एक नॉन-कास्ट एक्सेस ऑपरेटर ([]) प्रदान । इसे शामिल करने के लिए स्वतंत्र महसूस करें, लेकिन ध्यान रखें: चूंकि एबी में संदर्भ होते हैं, इसलिए इसे निर्दिष्ट करने के लिए मान ए और / या बी के भीतर मूल तत्वों को भी प्रभावित करेगा कि क्या यह एक वांछनीय विशेषता है या नहीं, यह एक आवेदन-विशिष्ट प्रश्न होना चाहिए। ध्यान से विचार करें।
- सीधे ए या बी (जैसे मान निर्दिष्ट करना, छांटना, आदि) में किए गए कोई भी परिवर्तन भी एबी को "संशोधित" करेंगे। यह आवश्यक रूप से खराब नहीं है (वास्तव में, यह बहुत आसान हो सकता है: एबी को कभी भी ए और बी दोनों के लिए खुद को सिंक्रनाइज़ रखने के लिए स्पष्ट रूप से अपडेट होने की आवश्यकता नहीं है), लेकिन यह निश्चित रूप से एक व्यवहार है जिसके बारे में पता होना चाहिए। महत्वपूर्ण अपवाद: ए और / या बी को बड़ा करने के लिए इनका नेतृत्व करने के लिए ये स्मृति में (वास्तविक स्थान की आवश्यकता के लिए) हो सकता है, और यह बदले में एबी को अमान्य कर देगा।
- क्योंकि एक तत्व की हर पहुंच एक परीक्षण से पहले होती है (जैसे, "i <v1.size ()"), VecProxy एक्सेस टाइम, हालांकि स्थिर, वैक्टर की तुलना में थोड़ा धीमा भी है।
- यह दृष्टिकोण n वैक्टर के लिए सामान्यीकृत किया जा सकता है। मैंने कोशिश नहीं की है, लेकिन यह एक बड़ी बात नहीं होनी चाहिए।