Diferentes métodos para copiar en C++ STL | std::copiar(), copiar_n(), copiar_si(), copiar_hacia atrás()

Existen varias variedades de copy() en C++ STL que permiten realizar las operaciones de copia de diferentes maneras, todas ellas con su propio uso. Todos estos se definen en el encabezado <algoritmo>. Este artículo presenta a todos estas funciones para su uso en la programación diaria. 
1. copy(strt_iter1, end_iter1, strt_iter2): la función de copia genérica utilizada para copiar un rango de elementos de un contenedor a otro. Se necesitan 3 argumentos: 

  • strt_iter1 : El puntero al comienzo del contenedor de origen, desde donde los elementos deben comenzar a copiarse.
  • end_iter1: el puntero al final del contenedor de origen, hasta donde se deben copiar los elementos.
  • strt_iter2 : El puntero al comienzo del contenedor de destino, donde los elementos deben comenzar a copiarse.

2. copy_n(strt_iter1, num, strt_iter2) : Esta versión de copy da la libertad de elegir cuántos elementos deben copiarse en el contenedor de destino. También toma 3 argumentos: 

  • strt_iter1 : El puntero al comienzo del contenedor de origen, desde donde los elementos deben comenzar a copiarse.
  • num: número entero que especifica cuántos números se copiarán en el contenedor de destino a partir de strt_iter1. Si se ingresa un número negativo, no se realiza ninguna operación.
  • strt_iter2 : El puntero al comienzo del contenedor de destino, donde los elementos deben comenzar a copiarse.

CPP

// 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] << " ";
   
}

Producción: 

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(): como sugiere el nombre, esta función copia de acuerdo con el resultado de una » condición «. Esto se proporciona con la ayuda de un cuarto argumento , una función que devuelve un valor booleano
Esta función toma 4 argumentos, 3 de ellos similares a copy() y una función adicional, que cuando devuelve verdadero, se copia un número, de lo contrario, no se copia el número.
4. copy_backward(): esta función comienza a copiar elementos en el contenedor de destino desde atrás y continúa copiando hasta que no se copian todos los números. La copia comienza desde el » strt_iter2 » pero en dirección hacia atrás. También toma argumentos similares a los de copy().

CPP

// C++ code to demonstrate the working of copy_if()
// and copy_backward()
 
#include<iostream>
#include<algorithm> // for copy_if() and copy_backward()
#include<vector>
using namespace std;
 
int main()
{
     
    // initializing source vector
    vector<int> v1 = { 1, 5, 6, 3, 8, 3 };
         
    // declaring destination vectors
    vector<int> v2(6);
    vector<int> 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<v2.size(); i++)
    cout << v2[i] << " ";
         
    cout << endl;
         
    // using copy_backward() to copy 1st 4 elements
    // ending at second last position
    copy_backward(v1.begin(), v1.begin() + 4, v3.begin()+ 5);
         
    // printing new vector
    cout << "The new vector elements entered using copy_backward() : ";
    for(int i=0; i<v3.size(); i++)
    cout << v3[i] << " ";
 
}

Producción: 

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. Copie usando el insertador():

Antes de la operación copy(), comprendamos la sintaxis de inserter(). 

inserter() se usa como un destino donde queremos copiar los elementos del contenedor.

inserter() toma dos parámetros. El primero es un contenedor de tipo arbitrario y el segundo es un iterador en el contenedor.

Devuelve una instancia de insert_iterator trabajando en un contenedor de tipo arbitrario. Esta función contenedora ayuda a crear instancias de insert_iterator. Escribir el nombre del iterador % requiere conocer el tipo completo exacto del contenedor, lo que puede ser tedioso e impide la programación genérica. El uso de esta función le permite aprovechar la deducción automática de parámetros de plantilla, lo que hace que el compilador coincida con los tipos correctos para usted.

La sintaxis para 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.

La sintaxis para copiar usando 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 <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;
 
    //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] << " ";
 
}

Producción:

The new vector elements entered using inserter: 1 5 7 3 8 3 

Este artículo es una contribución de Manjeet Singh . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *