Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วิธีการต่างๆ ในการคัดลอกใน C++ STL - std::copy(), copy_n(), copy_if(), copy_backwards()


ตามที่ชื่อเมธอดแนะนำว่า copy() จะใช้เมธอดในการคัดลอกข้อมูลด้วยวิธีต่างๆ ที่มีอยู่ใน C++ STL วิธีการทั้งหมดแตกต่างกันในฟังก์ชันการทำงานและพารามิเตอร์ วิธีการเหล่านี้มีอยู่ในไฟล์ส่วนหัว <อัลกอริทึม> มาพูดถึงแต่ละวิธีและฟังก์ชันกัน

คัดลอก(start_i1, end_i1, start_i2)

วิธีนี้ใช้เพื่อคัดลอกข้อมูลจากตัววนซ้ำหนึ่งไปยังตัววนซ้ำอื่นภายในช่วงที่ระบุ โดยที่ทั้งองค์ประกอบเริ่มต้นและสิ้นสุดของตัววนซ้ำนั้นรวมอยู่ด้วย ต้องใช้อาร์กิวเมนต์สามประเภทคือ −

  • Start_i1 − มันจะชี้ไปที่องค์ประกอบเริ่มต้นของตัววนซ้ำ สมมติว่า i_1 จากตำแหน่งที่องค์ประกอบจะถูกคัดลอกไปยังตัววนซ้ำอื่น สมมติว่า i_2

  • End_i1 − มันจะชี้ไปที่องค์ประกอบสุดท้ายของตัววนซ้ำ สมมติว่า i_1 จนถึงตำแหน่งที่องค์ประกอบจะถูกคัดลอกไปยังตัววนซ้ำอื่น สมมติว่า i_2

  • Start_i2 − มันจะชี้ไปที่ตำแหน่งเริ่มต้นของตัววนซ้ำในตำแหน่งที่องค์ประกอบจะถูกคัดลอก เช่น i_2

คืนค่า − มันจะส่งคืนตัววนซ้ำที่ชี้ไปที่จุดสิ้นสุดของตัววนซ้ำปลายทาง เช่น i_2 จนถึงตำแหน่งที่องค์ประกอบถูกคัดลอก

ตัวอย่าง

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
   //creating vector v1
   vector<int> vec_1 = { 10, 20, 30, 40, 50 };
   //declaring empty vector of size
   vector<int> vec_2(6);
   // using copy() function to copy in vector 2
   copy(vec_1.begin(), vec_1.begin()+4, vec_2.begin());
   //print new vector
   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 จากตำแหน่งที่องค์ประกอบจะถูกคัดลอกไปยังตัววนซ้ำอื่น สมมติว่า i_2

  • รวม − มันอธิบายจำนวนองค์ประกอบที่จะคัดลอกโดยเริ่มจากตำแหน่งที่ระบุโดย start_i1 ใช้ได้ทั้งจำนวนเต็มบวกและจำนวนเต็มลบ แต่จะไม่ดำเนินการใดๆ หากเป็นค่าลบ

  • Start_i2 − มันจะชี้ไปที่ตำแหน่งเริ่มต้นของตัววนซ้ำในตำแหน่งที่องค์ประกอบจะถูกคัดลอก เช่น i_2

คืนค่า − มันจะส่งคืนตัววนซ้ำที่ชี้ไปที่จุดสิ้นสุดของตัววนซ้ำปลายทาง เช่น i_2 จนถึงตำแหน่งที่องค์ประกอบถูกคัดลอก

ตัวอย่าง

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
   //creating vector v1
   vector<int> vec_1 = { 10, 20, 30, 40, 50 };
   //declaring empty vector of size
   vector<int> vec_2(6);
   // using copy_n() function to copy in vector 2
   copy_n(vec_1.begin(), 4, vec_2.begin());
   //print new vector
   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, ฟังก์ชันบูลีน)

วิธีนี้ใช้เพื่อคัดลอกข้อมูลจากตัววนซ้ำหนึ่งไปยังตัววนซ้ำอื่นภายในช่วงที่ระบุตามเงื่อนไขที่ใช้กับช่วงซึ่งจะถูกกำหนดในอาร์กิวเมนต์ที่สี่ที่ส่งผ่านไปยังฟังก์ชันนี้ ต้องใช้อาร์กิวเมนต์สี่ประเภทคือ−

  • Start_i1 − มันจะชี้ไปที่องค์ประกอบเริ่มต้นของตัววนซ้ำ สมมติว่า i_1 จากตำแหน่งที่องค์ประกอบจะถูกคัดลอกไปยังตัววนซ้ำอื่น สมมติว่า i_2

  • End_i1 − มันจะชี้ไปที่องค์ประกอบสุดท้ายของตัววนซ้ำ สมมติว่า i_1 จนถึงตำแหน่งที่องค์ประกอบจะถูกคัดลอกไปยังตัววนซ้ำอื่น สมมติว่า i_2

  • Start_i2 &รถสองแถว; โดยจะชี้ไปที่ตำแหน่งเริ่มต้นของตัววนซ้ำในตำแหน่งที่องค์ประกอบจะถูกคัดลอก เช่น i_2

  • ฟังก์ชันบูลีน − ในฟังก์ชันนี้ เราจะผ่านเงื่อนไขที่เราต้องการกำหนดให้กับช่วง เนื่องจากประเภทการส่งคืนของฟังก์ชันนี้คือบูลีน มันจะคืนค่าจริง/เท็จ และขึ้นอยู่กับค่าที่ส่งคืน องค์ประกอบช่วงจะแสดงขึ้น

คืนค่า − มันจะส่งคืนตัววนซ้ำที่ชี้ไปที่จุดสิ้นสุดของตัววนซ้ำปลายทาง เช่น i_2 จนถึงตำแหน่งที่องค์ประกอบถูกคัดลอก

ตัวอย่าง

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
   //creating vector v1
   vector<int> vec_1 = { 10, 21, 30, 40, 57 };
   //declaring empty vector of size
   vector<int> vec_2(6);
   // using copy_if() function to copy in vector 2
   copy_if(vec_1.begin(), vec_1.end(), vec_2.begin(), [](int i){return i%2==0;});
   //print new vector
   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_backwards(start_i1, end_i1, end_i2)

วิธีนี้ใช้เพื่อคัดลอกข้อมูลจากตัววนซ้ำหนึ่งไปยังตัววนซ้ำอื่นภายในช่วงที่ระบุในทิศทางย้อนกลับ ซึ่งหมายความว่าตัววนซ้ำจะถูกย้ายไปยังจุดสิ้นสุดตามขนาดและจากองค์ประกอบตำแหน่งนั้นจะถูกวาง ต้องใช้อาร์กิวเมนต์สามประเภทคือ−

  • Start_i1 − มันจะชี้ไปที่องค์ประกอบเริ่มต้นของตัววนซ้ำ สมมติว่า i_1 จากตำแหน่งที่องค์ประกอบจะถูกคัดลอกไปยังตัววนซ้ำอื่น สมมติว่า i_2

  • End_i1 − มันจะชี้ไปที่องค์ประกอบสุดท้ายของตัววนซ้ำ สมมติว่า i_1 จนถึงตำแหน่งที่องค์ประกอบจะถูกคัดลอกไปยังตัววนซ้ำอื่น สมมติว่า i_2

  • end_i2 − มันจะชี้ไปที่ตำแหน่งสิ้นสุดของตัววนซ้ำในตำแหน่งที่องค์ประกอบจะถูกคัดลอก เช่น i_2

คืนค่า − มันจะส่งคืนตัววนซ้ำที่ชี้ไปที่องค์ประกอบเริ่มต้นของตัววนซ้ำปลายทาง เช่น i_2 จนถึงตำแหน่งที่องค์ประกอบถูกคัดลอก

ตัวอย่าง

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
   //creating vector v1
   vector<int> vec_1 = { 10, 21, 30, 40, 57,67 };
   //declaring empty vector of size
   vector<int> vec_2(6);
   // using copy_backward() function to copy in vector 2
   copy_backward(vec_1.begin(), vec_1.end()+4, vec_2.begin()+5);
   //print new vector
   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