C++ STL 中不同的复制方法 - std::copy()、copy_n()、copy_if()、copy_backwards()
顾名思义,copy() 方法用于通过 C++ STL 中提供的各种方法复制数据。所有方法的功能和参数都不同。这些方法在 <algorithm> 头文件中可用。让我们讨论每种方法及其功能。
Copy(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。
Total − 它描述了从 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。
布尔函数 − 在此函数中,我们将传递要施加到范围的条件。由于此函数的返回类型是布尔值,它将返回 true/false,并且根据返回值将显示范围元素。
返回值 − 它将返回指向目标迭代器末尾的迭代器,即 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