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

📅  最后修改于: 2021-05-30 17:50:50             🧑  作者: Mango

C++ STL中存在各种copy()品种,它们允许以不同的方式执行复制操作,它们都有自己的用途。这些都在头文件中定义。本文向所有人介绍这些功能,以供日常编程中使用。
1. copy(strt_iter1,end_iter1,strt_iter2):用于一系列元素从一个容器复制到另一个容器的通用复制函数。它需要3个参数:

  • strt_iter1:指向源容器起点的指针,必须从此处开始复制元素。
  • end_iter1:指向源容器末尾的指针,直到必须复制元素的位置。
  • strt_iter2:指向目标容器开始的指针,指向必须开始复制元素的位置。

2. copy_n(strt_iter1,num,strt_iter2):此版本的副本使您可以自由选择必须在目标容器中复制多少个元素。 IT还接受3个论点:

  • strt_iter1:指向源容器起点的指针,必须从此处开始复制元素。
  • num:整数,指定将从strt_iter1开始将多少个数字复制到目标容器。如果输入负数,则不执行任何操作。
  • strt_iter2:指向目标容器开始的指针,指向必须开始复制元素的位置。
CPP
// C++ code to demonstrate the working of copy()
// and copy_n()
 
#include
#include // for copy() and copy_n()
#include
using namespace std;
 
int main()
{
     
   // initializing source vector
   vector v1 = { 1, 5, 7, 3, 8, 3 };
    
   // declaring destination vectors
   vector v2(6);
   vector 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


CPP
// C++ code to demonstrate the working of copy_if()
// and copy_backward()
 
#include
#include // for copy_if() and copy_backward()
#include
using namespace std;
 
int main()
{
     
    // initializing source vector
    vector v1 = { 1, 5, 6, 3, 8, 3 };
         
    // declaring destination vectors
    vector v2(6);
    vector v3(6);
         
    // using copy_if() to copy odd elements
    copy_if(v1.begin(), v1.end(), v2.begin(), [](int i){return i%2!=0;});
         
    // printing new vector
    cout << "The new vector elements entered using copy_if() : ";
    for(int i=0; i


C++
// C++ code to demonstrate the working of copy() using inserter()
 
#include 
#include 
#include 
using namespace std;
 
int main()
{
 
    vector v1 = {1, 5, 7, 3, 8, 3};
    vector::iterator itr;
    vector v2;
 
    //using inserter()
    copy(v1.begin(), v1.end(), inserter(v2, itr));
 
    cout << "\nThe new vector elements entered using inserter: ";
    for (int i = 0; i < v2.size(); i++)
        cout << v2[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():顾名思义,此函数根据“ condition ”的结果进行复制。这是在第4个参数的帮助下提供的,该函数返回一个布尔值
此函数有4个参数,其中3个类似于copy()和一个附加函数,当返回true时,将复制一个数字,否则不复制数字。
4. copy_backward():此函数从后开始将元素复制到目标容器中并一直进行复制,直到所有数字都未复制为止。复制从“ strt_iter2 ”开始,但向后。它还采用与copy()类似的参数。

CPP

// C++ code to demonstrate the working of copy_if()
// and copy_backward()
 
#include
#include // for copy_if() and copy_backward()
#include
using namespace std;
 
int main()
{
     
    // initializing source vector
    vector v1 = { 1, 5, 6, 3, 8, 3 };
         
    // declaring destination vectors
    vector v2(6);
    vector v3(6);
         
    // using copy_if() to copy odd elements
    copy_if(v1.begin(), v1.end(), v2.begin(), [](int i){return i%2!=0;});
         
    // printing new vector
    cout << "The new vector elements entered using copy_if() : ";
    for(int i=0; i

输出:

The new vector elements entered using copy_if() : 1 5 3 3 0 0 
The new vector elements entered using copy_backward() : 0 1 5 6 3 0 

5.使用inserter()复制:

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

inserter()用作我们要在其中复制容器元素的目的地。

inserter()有两个参数。第一个是任意类型的容器,第二个是容器的迭代器。

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

inserter()的语法:

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

x: Destination container where the new elements will 
be inserted.
it: Iterator pointing to the insertion point.

Returns: An insert_iterator that inserts elements into 
x at the position indicated by it.

使用inserter()复制的语法:

copy(strt_iter1, end_iter1, inserter(Container& x, typename Container::iterator it));

C++

// C++ code to demonstrate the working of copy() using inserter()
 
#include 
#include 
#include 
using namespace std;
 
int main()
{
 
    vector v1 = {1, 5, 7, 3, 8, 3};
    vector::iterator itr;
    vector v2;
 
    //using inserter()
    copy(v1.begin(), v1.end(), inserter(v2, itr));
 
    cout << "\nThe new vector elements entered using inserter: ";
    for (int i = 0; i < v2.size(); i++)
        cout << v2[i] << " ";
 
}

输出:

The new vector elements entered using inserter: 1 5 7 3 8 3 
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”