কম্পিউটার টিউটোরিয়াল

C++ STL-এ কপি করার বিভিন্ন পদ্ধতি - std::copy(), copy_n(), copy_if(), copy_backward()


নাম অনুযায়ী, copy() মেথডটি C++ STL-এ ডেটা কপি করার জন্য ব্যবহৃত হয়। সব পদ্ধতির ফাংশনালিটি এবং প্যারামিটার ভিন্ন। এই পদ্ধতিগুলো <algorithm> হেডার ফাইলে উপলব্ধ। নিচে প্রতিটি মেথড এবং তাদের কার্যকারিতা আলোচনা করা হলো।

copy(start_i1, end_i1, start_i2)

এই মেথডটি একটি ইটেরেটর থেকে অন্য ইটেরেটরে নির্দিষ্ট রেঞ্জের ডেটা কপি করে, যেখানে শুরু এবং শেষ উভয় এলিমেন্টই ইনক্লুসিভ। এটি তিনটি আর্গুমেন্ট নেয়:

  • Start_i1 − সোর্স ইটেরেটর (যেমন i_1)য় প্রথম এলিমেন্টকে পয়েন্ট করে, যেখান থেকে কপি শুরু হবে।
  • End_i1 − সোর্স ইটেরেটর (যেমন i_1)য় শেষ এলিমেন্টকে পয়েন্ট করে, যāv쇠 পর্যন্ত কপি হবে।
  • Start_i2 − ডেস্টিনেশন ইটেরেটর (যেমন i_2)য় শুরুয় এলিমেন্ট কপি হবে এমন লোকেশনকে পয়েন্ট করে।

রিটার্ন ভ্যালু − ডেস্টিনেশন ইটেরেটরের শেষে (যেখানে এলিমেন্টগুলো কপি হয়েছে) একটি ইটেরেটর রিটার্ন করে।

উদাহরণ

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    // ভেক্টর v1 তৈরি
    vector<int> vec_1 = { 10, 20, 30, 40, 50 };
    // নির্দিষ্ট সাইজের খালি ভেক্টর ঘোষণা
    vector<int> vec_2(6);
    // copy() ফাংশন ব্যবহার করে vec_2-এ কপি
    copy(vec_1.begin(), vec_1.begin() + 4, vec_2.begin());
    // নতুন ভেক্টর প্রিন্ট
    cout << "Elements in vector v2 copied from v1: ";
    for (int i = 0; i < 4; i++) {
        cout << vec_2[i] << " ";
    }
}

আউটপুট

Elements in vector v2 copied from v1: 10 20 30 40

copy_n(start_i1, total, start_i2)

এই মেথডটিও একটি ইটেরেটর থেকে অন্য ইটেরেটরে ডেটা কপি করে, কিন্তু এটি কম্পাইলারকে বলে দেয় যে নির্দিষ্ট লোকেশন থেকে মোট কতগুলো এলিমেন্ট কপি করতে হবে। এটি তিনটি আর্গুমেন্ট নেয়:

  • Start_i1 − সোর্স ইটেরেটরের (যেমন i_1) প্রথম এলিমেন্টকে পয়েন্ট করে।
  • Total − start_i1 লোকেশন থেকে শুরু করে মোট কতগুলো এলিমেন্ট কপি হবে তা নির্দেশ করে। এটি পজিটিভ এবং নেগেটিভ উভয় ইন্টিজার নিতে পারে, কিন্তু নেগেটিভ হলে কোন অপারেশন করবে না।
  • Start_i2 − ডেস্টিনেশন ইটেরেটরের (যেমন i_2) শুরুয় এলিমেন্ট কপি হবে এমন লোকেশনকে পয়েন্ট করে।

রিটার্ন ভ্যালু − ডেস্টিনেশন ইটেরেটরের শেষে একটি ইটেরেটর রিটার্ন করে।

উদাহরণ

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    vector<int> vec_1 = { 10, 20, 30, 40, 50 };
    vector<int> vec_2(6);
    // copy_n() ফাংশন ব্যবহার
    copy_n(vec_1.begin(), 4, vec_2.begin());
    cout << "Elements in vector v2 copied from v1: ";
    for (int i = 0; i < 4; i++) {
        cout << vec_2[i] << " ";
    }
}

আউটপুট

Elements in vector v2 copied from v1: 10 20 30 40

copy_if(start_i1, end_i1, start_i2, Boolean function)

এই মেথডটি নির্দিষ্ট রেঞ্জের মধ্যে শর্তানুযায়ী ডেটা কপি করে। শর্তটি চতুর্থ আর্গুমেন্ট হিসেবে একটি বুলিয়ান ফাংশন দিয়ে দেওয়া হয়। এটি চারটি আর্গুমেন্ট নেয়:

  • Start_i1 − সোর্স ইটেরেটরের প্রথম এলিমেন্ট।
  • End_i1 − সোর্স ইটেরেটরের শেষ এলিমেন্ট।
  • Start_i2 − ডেস্টিনেশন ইটেরেটরের শুরুয় লোকেশন।
  • Boolean function − রেঞ্জের ওপর আরোপ করা শর্ত। এই ফাংশনের রিটার্ন টাইপ বুলিয়ান, তাই এটি true/false রিটার্ন করে এবং রিটার্ন ভ্যালুর ভিত্তিতে এলিমেন্টগুলো কপি হয়।

রিটার্ন ভ্যালু − ডেস্টিনেশন ইটেরেটরের শেষে একটি ইটেরেটর রিটার্ন করে।

উদাহরণ

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    vector<int> vec_1 = { 10, 21, 30, 40, 57 };
    vector<int> vec_2(6);
    // copy_if() ফাংশন ব্যবহার করে জোড় সংখ্যা কপি
    copy_if(vec_1.begin(), vec_1.end(), vec_2.begin(), [](int i) { return i % 2 == 0; });
    cout << "Elements in vector v2 copied from v1: ";
    for (int i = 0; i < 4; i++) {
        cout << vec_2[i] << " ";
    }
}

আউটপুট

Elements in vector v2 copied from v1: 10 30 40 0

copy_backward(start_i1, end_i1, end_i2)

এই মেথডটি নির্দিষ্ট রেঞ্জের ডেটা পেছনের দিকে (backward direction-এ) কপি করে। অর্থাৎ ইটেরেটরটি এর সাইজ অনুযায়ী শেষে চলে যায় এবং সেখান থেকে এলিমেন্টগুলো পেস্ট করা হয়। এটি তিনটি আর্গুমেন্ট নেয়:

  • Start_i1 − সোর্স ইটেরেটরের প্রথম এলিমেন্ট।
  • End_i1 − সোর্স ইটেরেটরের শেষ এলিমেন্ট।
  • end_i2 − ডেস্টিনেশন ইটেরেটরের শেষ লোকেশন, যেখানে এলিমেন্টগুলো কপি হবে।

রিটার্ন ভ্যালু − ডেস্টিনেশন ইটেরেটরের শুরুয় এলিমেন্টকে পয়েন্ট করে একটি ইটেরেটর রিটার্ন করে।

উদাহরণ

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
    vector<int> vec_1 = { 10, 21, 30, 40, 57, 67 };
    vector<int> vec_2(6);
    // copy_backward() ফাংশন ব্যবহার
    copy_backward(vec_1.begin(), vec_1.end() - 2, vec_2.begin() + 5);
    cout << "Elements in vector v2 copied from v1: ";
    for (int i = 0; i < vec_2.size(); i++) {
        cout << vec_2[i] << " ";
    }
}

আউটপুট

Elements in vector v2 copied from v1: 0 10 21 30 40 0
  1. C++-এ std::vector শাফেল করার পদ্ধতি

  2. C++-এ std::vector::resize() বনাম std::vector::reserve() পার্থক্য

  3. C++ STL-এ Vector বাস্তবায়ন: ডাইনামিক অ্যারে ব্যবহার

  4. C++ STL-এ কাস্টম অবজেক্টের ভেক্টর সোর্ট করা (Sorting Vector of Custom Objects)