درمورد آرایهها، گزینههای زیادی برای کپی یک آرایه به درون آرایهی دیگر وجود ندارد، به جز روش تکرار. به عنوان مثال اجرای یک حلقه برای کپی هر عنصر به ترتیب شاخص یا index. اما در کلاسهای بردار (vector) بیشاز یک روش برای کپی کامل بردار به درون بردار دیگری در وجود دارد. دو نوع اساسی از کپی کردن بردار عبارتند از:
روش اول: روش تکرار
این روش یک روش معمول برای کپی کردن بردار است، در این روش یک حلقه برای () push_back عناصر بردار قدیمی به درون بردار جدید استفاده شده است. آنها به صورت deeply کپی میشوند:
// C++ code to demonstrate copy of vector // by iterative method. #include<iostream> #include<vector> using namespace std; int main() { // Initializing vector with values vector<int> vect1{1, 2, 3, 4}; // Declaring new vector vector<int> vect2; // A loop to copy elements of // old vector into new vector // by Iterative method for (int i=0; i<vect1.size(); i++) vect2.push_back(vect1[i]); cout << "Old vector elements are : "; for (int i=0; i<vect1.size(); i++) cout << vect1[i] << " "; cout << endl; cout << "New vector elements are : "; for (int i=0; i<vect2.size(); i++) cout << vect2[i] << " "; cout<< endl; // Changing value of vector to show that a new // copy is created. vect1[0] = 2; cout << "The first element of old vector is :"; cout << vect1[0] << endl; cout << "The first element of new vector is :"; cout << vect2[0] <<endl; return 0; }
خروجی قطهکد بالا به این صورت است:
Old vector elements are : 1 2 3 4 New vector elements are : 1 2 3 4 The first element of old vector is : 2 The first element of new vector is : 1
در قطعهکد بالا، تغییر مقدار در یک بردار باعث تغییر مقدار در بردار دیگر نمیشود، بنابراین به آنها آدرس مشابهی تخصیص داده نشدهاست. به خاطر این که deep copy است.
روش دوم: با عملگر تخصیص =
به سادگی بردار جدید را به بردار قدیمی تخصیص میدهد که بردار را کپی میکند. این روش تخصیص برای آرایهها امکانپذیر نیست.
// C++ code to demonstrate copy of vector // by iterative method. #include<iostream> #include<vector> using namespace std; int main() { // Initializing vector with values vector<int> vect1{1, 2, 3, 4}; // Declaring new vector vector<int> vect2; // Using assignment operator to copy one // vector to other vect2 = vect1; cout << "Old vector elements are : "; for (int i=0; i<vect1.size(); i++) cout << vect1[i] << " "; cout << endl; cout << "New vector elements are : "; for (int i=0; i<vect2.size(); i++) cout << vect2[i] << " "; cout<< endl; // Changing value of vector to show that a new // copy is created. vect1[0] = 2; cout << "The first element of old vector is :"; cout << vect1[0] << endl; cout << "The first element of new vector is :"; cout << vect2[0] <<endl; return 0; }
خروجی قطهکد بالا به این صورت است:
Old vector elements are : 1 2 3 4 New vector elements are : 1 2 3 4 The first element of old vector is : 2 The first element of new vector is : 1
روش سوم: ارسال بردار به سازنده (constructor)
در زمان اعلام کردن یک بردار، ارسال یک بردار که قبلا مقداردهی اولیه شده است، عناصر بردار ارسالشده را به داخل بردار اعلامشده جدید کپی میکند که به صورت deeply copied است.
// C++ code to demonstrate copy of vector // by constructor method. #include<bits/stdc++.h> using namespace std; int main() { // Initializing vector with values vector<int> vect1{1, 2, 3, 4}; // Declaring new vector and copying // element of old vector // constructor method, Deep copy vector<int> vect2(vect1); cout << "Old vector elements are : "; for (int i=0; i<vect1.size(); i++) cout << vect1[i] << " "; cout << endl; cout << "New vector elements are : "; for (int i=0; i<vect2.size(); i++) cout << vect2[i] << " "; cout<< endl; // Changing value of vector to show that a new // copy is created. vect1[0] = 2; cout << "The first element of old vector is :"; cout << vect1[0] << endl; cout << "The first element of new vector is :"; cout << vect2[0] <<endl; return 0; }
خروجی قطهکد بالا به این صورت است:
Old vector elements are : 1 2 3 4 New vector elements are : 1 2 3 4 The first element of old vector is :2 The first element of new vector is :1
روش چهارم: استفاده از توابع داخلی
- copy(first_iterator_o, last_iterator_o, back_inserter()): این روش دیگری برای کپی بردار قدیمی به درون بردار جدید است. این تابع 3 آرگومانت دریافت میکند، اولین آرگومانت مربوط به پیمایشگر اول از بردار قدیمی، دومین آرگومانت مربوط به آخرین پیمایشگر از بردار قدیمی و سومین آرگومانت مربوط به تابع back_inserter است که مقادیر را از عقب درج میکند. این نیز یک deep copy تولید میکند.
// C++ code to demonstrate copy of vector // by assign() and copy(). #include<iostream> #include<vector> // for vector #include<algorithm> // for copy() and assign() #include<iterator> // for back_inserter using namespace std; int main() { // Initializing vector with values vector<int> vect1{1, 2, 3, 4}; // Declaring new vector vector<int> vect2; // Copying vector by copy function copy(vect1.begin(), vect1.end(), back_inserter(vect2)); cout << "Old vector elements are : "; for (int i=0; i<vect1.size(); i++) cout << vect1[i] << " "; cout << endl; cout << "New vector elements are : "; for (int i=0; i<vect2.size(); i++) cout << vect2[i] << " "; cout<< endl; // Changing value of vector to show that a new // copy is created. vect1[0] = 2; cout << "The first element of old vector is :"; cout << vect1[0] << endl; cout << "The first element of new vector is :"; cout << vect2[0] <<endl; return 0; }
خروجی قطعهکُد بالا به این صورت است:
Old vector elements are : 1 2 3 4 New vector elements are : 1 2 3 4 The first element of old vector is :2 The first element of new vector is :1
- assign(first_iterator_o, last_iterator_o): این روش مقادیر مشابه به بردار جدید به عنوان بردار قدیمی تخصیص میدهد. این تابع 2 آرگومانت میگیرد، پیمایشگر اول برای بردار قدیمی و پیمایشگر آخر برای بردار قدیمی. این یک deep copy تولید میکند.
// C++ code to demonstrate copy of vector // by assign() #include<iostream> #include<vector> // for vector #include<algorithm> // for copy() and assign() #include<iterator> // for back_inserter using namespace std; int main() { // Initializing vector with values vector<int> vect1{1, 2, 3, 4}; // Declaring another vector vector<int> vect2; // Copying vector by assign function vect2.assign(vect1.begin(), vect1.end()); cout << "Old vector elements are : "; for (int i=0; i<vect1.size(); i++) cout << vect1[i] << " "; cout << endl; cout << "New vector elements are : "; for (int i=0; i<vect2.size(); i++) cout << vect2[i] << " "; cout<< endl; // Changing value of vector to show that a new // copy is created. vect1[0] = 2; cout << "The first element of old vector is :"; cout << vect1[0] << endl; cout << "The first element of new vector is :"; cout << vect2[0] <<endl; return 0; }
خروجی قطعهکُد بالا به این صورت است:
Old vector elements are : 1 2 3 4 New vector elements are : 1 2 3 4 The first element of old vector is :2 The first element of new vector is :1
منبع: وب سایت geeksforgeeks