ব্র্যাডগনসুরফিংয়ের উত্তরের দিকে, বেশিরভাগ সময়ই দু'জন ভেক্টরকে (ও (এন)) সংশ্লেষ করার প্রয়োজন হয় না , বরং তাদের সাথে কেবল এমনভাবে কাজ করুন যেন তারা কনকানটেটেড হয়েছে (ও (1)) । এটি যদি আপনার হয় তবে এটি বুস্ট লাইব্রেরির প্রয়োজন ছাড়াই করা যেতে পারে।
কৌশলটি একটি ভেক্টর প্রক্সি তৈরি করা: একটি র্যাপার ক্লাস যা উভয় ভেক্টরের রেফারেন্সগুলি ম্যানিপুলেট করে , বাহ্যিকভাবে একক, সংলগ্ন হিসাবে দেখা যায়।
, USAGE
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(); };
মেইন বেনিফিট
এটি তৈরি করতে ও (1) (ধ্রুবক সময়) এবং কমপক্ষে অতিরিক্ত মেমরির বরাদ্দ রয়েছে।
বিবেচনার জন্য কিছু স্টাফ
- রেফারেন্সগুলি নিয়ে কাজ করার সময় আপনি কী করছেন তা যদি আপনি সত্যিই জানেন যে আপনি কেবল তখনই এর জন্য যাওয়া উচিত । এই সমাধানটি তৈরি করা প্রশ্নের নির্দিষ্ট উদ্দেশ্যে তৈরি করা হয়েছে, যার জন্য এটি বেশ ভালভাবে কাজ করে । অন্য যে কোনও প্রসঙ্গে এটিকে নিয়োগ করা যদি রেফারেন্সগুলি কীভাবে কাজ করে তা সম্পর্কে আপনি নিশ্চিত না হন তবে অপ্রত্যাশিত আচরণ হতে পারে।
- এই উদাহরণে, এবি নেই না একটি অ-const এক্সেস অপারেটর প্রদান ([])। এটি অন্তর্ভুক্ত নির্দ্বিধায় মনে রাখবেন, তবে মনে রাখবেন: যেহেতু এবি রেফারেন্স ধারণ করে, মান নির্ধারণের ফলে এ এবং এবং বা বি এর মূল উপাদানগুলিকেও প্রভাবিত করবে এটি একটি পছন্দসই বৈশিষ্ট্য কিনা বা না, এটি একটি অ্যাপ্লিকেশন-নির্দিষ্ট প্রশ্ন হওয়া উচিত সাবধানে বিবেচনা করুন।
- এ বা বি এর মধ্যে সরাসরি যে কোনও পরিবর্তন করা হয়েছে (যেমন মান নির্ধারণ, বাছাই করা ইত্যাদি )ও AB কে "সংশোধন" করবে। এটি অগত্যা খারাপ নয় (আসলে এটি খুব সহজেই কার্যকর হতে পারে: এ এবং বি উভয়ের সাথে নিজেকে সুসংগত রাখার জন্য এবি'র কখনও স্পষ্টভাবে আপডেট করার প্রয়োজন হয় না) তবে অবশ্যই এটি এমন একটি আচরণ যা সম্পর্কে অবহিত হওয়া আবশ্যক। গুরুত্বপূর্ণ ব্যতিক্রম: A এবং / অথবা B এর আকার আরও বড় আকার পরিবর্তন করা এগুলিকে স্মৃতিতে পুনরায় স্থানান্তরিত করতে পারে (স্বচ্ছ স্থানের প্রয়োজনের জন্য), এবং এটি ফলশ্রুতিতে AB কে অবৈধ করে দেবে।
- কারণ কোনও উপাদানের প্রতিটি অ্যাক্সেস পরীক্ষার আগে হয় (যথা, "i <v1.size ()"), ভেকপ্রক্সির অ্যাক্সেস সময়, যদিও ধ্রুবক থাকে, এটি ভেক্টরগুলির তুলনায়ও কিছুটা ধীর হয়।
- এই পদ্ধতির এন ভেক্টরগুলিতে সাধারণীকরণ করা যেতে পারে। আমি চেষ্টা করিনি, তবে এটি কোনও বড় বিষয় হওয়া উচিত নয়।