C++ STL中不同的复制方法 | std :: copy(),copy_n(),copy_if(),copy_backward()

C++ STL中不同的复制方法 | std :: copy(),copy_n(),copy_if(),copy_backward()

C++ STL中存在各种类型的copy()函数,允许以不同的方式执行复制操作,它们都具有自己的用途。这些函数都定义在头文件<algorithm>中。本文介绍这些函数的用法,方便日常编程。

1. copy(strt_iter1,end_iter1,strt_iter2): 通用的copy函数用于将一个容器的元素 复制 到另一个容器中的 范围 内。它需要3个参数:

  • strt_iter1: 源容器的开头指针,从这里开始复制元素。
  • end_iter1: 源容器的结尾指针,直到这里停止复制元素。
  • strt_iter2: 目标容器的开头指针,从这里开始复制元素。

2. copy_n(strt_iter1,num,strt_iter2): 这个版本的copy()函数允许选择在目标容器中复制多少个元素。他同样需要三个参数:

  • strt_iter1: 源容器的开头指针,从这里开始复制元素。
  • num: 指定从strt_iter1开始复制多少个数字到目标容器。如果输入负数,则不执行任何操作。
  • strt_iter2: 目标容器的开头指针,从这里开始复制元素。
// C++ code to demonstrate the working of copy()
// and copy_n()
 
#include<iostream>
#include<algorithm> // for copy() and copy_n()
#include<vector>
using namespace std;
 
int main()
{
     
   // initializing source vector
   vector<int> v1 = { 1, 5, 7, 3, 8, 3 };
    
   // declaring destination vectors
   vector<int> v2(6);
   vector<int> v3(6);
    
   // using copy() to copy 1st 3 elements
   copy(v1.begin(), v1.begin()+3, v2.begin());
    
   // printing new vector
   cout << "The new vector elements entered using copy() : ";
   for(int i=0; i<v2.size(); i++)
   cout << v2[i] << " ";
    
   cout << endl;
    
   // using copy_n() to copy 1st 4 elements
   copy_n(v1.begin(), 4, v3.begin());
    
   // printing new vector
   cout << "The new vector elements entered using copy_n() : ";
   for(int i=0; i<v3.size(); i++)
   cout << v3[i] << " ";
   
}  

输出:

The new vector elements entered using copy() : 1 5 7 0 0 0 
The new vector elements entered using copy_n() : 1 5 7 3 0 0 

3. copy_if(): 这个函数根据 条件 的“ 结果 ”进行复制。可通过一个 返回布尔值的函数 来实现。

这个函数需要4个参数,其中3个和copy()相似,另一个是函数,当返回true时候把数字复制到容器中,否则不复制。

4. copy_backward(): 这个函数从 后向前 开始将元素复制到目标容器,并一直复制直到所有数字都被复制。复制从“strt_iter2”开始,但在向后的方向上。它也需要与copy()相似的参数。

// C ++代码演示copy_if()和copy_backward()的工作

#include<iostream>
#include<algorithm> // 用于copy_if()和copy_backward()
#include<vector>
using namespace std;
 
int main()
{
     
    // 初始化源向量
    vector<int> v1 = { 1, 5, 6, 3, 8, 3 };
         
    // 声明目标向量
    vector<int> v2(6);
    vector<int> v3(6);
         
    // 使用copy_if()复制奇数元素
    copy_if(v1.begin(), v1.end(), v2.begin(), [](int i){return i%2!=0;});
         
    // 打印新向量
    cout << "使用copy_if()输入的新向量元素: ";
    for(int i=0; i<v2.size(); i++)
    cout << v2[i] << " ";
         
    cout << endl;
         
    // 使用copy_backward()复制前4个元素
    // 在倒数第二个位置结束
    copy_backward(v1.begin(), v1.begin() + 4, v3.begin()+ 5);
         
    // 打印新向量
    cout << "使用copy_backward()输入的新向量元素: ";
    for(int i=0; i<v3.size(); i++)
    cout << v3[i] << " ";
 
}  

输出:

使用copy_if()输入的新向量元素: 1 5 3 3 0 0 
使用copy_backward()输入的新向量元素: 0 1 5 6 3 0 

5. 使用插入器复制():

在进行copy()操作之前,让我们先了解inserter()的语法。

插入器()用作目标,用于将容器的元素复制到哪里。

插入器()接受两个参数。第一个是任意类型的容器,第二个是容器的迭代器。

它返回一个在任意类型的容器上工作的insert_iterator实例。这个包装函数有助于创建insert_iterator实例。键入迭代器的名称需要知道容器的精确完整类型,这可能很繁琐,妨碍通用编程。使用此函数可以利用自动模板参数推断,使编译器为您匹配正确的类型。

插入器的语法():

std::inserter(Container& x, typename Container::iterator it);

x: 目标容器,新元素将插入其中。
it: 指向插入点的迭代器。

返回: 将元素插入到由it指示的x位置的insert_iterator。

使用插入器的复制的语法():

copy(strt_iter1, end_iter1, inserter(Container& x, typename Container::iterator it));
// C ++代码演示使用inserter()复制的工作

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
int main()
{
 
    vector<int> v1 = {1, 5, 7, 3, 8, 3};
    vector<int>::iterator itr;
    vector<int> v2;
 
    //使用插入器()
    copy(v1.begin(), v1.end(),inserter(v2,itr));

    cout << "\n使用插入器输入的新向量元素: ";
    for (int i = 0; i < v2.size(); i++)
        cout << v2[i] << " ";
 
}  

输出:

使用插入器输入的新向量元素: 1 5 7 3 8 3 

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程