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

更新于:2020年8月14日

344 次浏览

启动你的 职业生涯

完成课程获得认证

开始学习
广告