Diferentes formas de copiar un vector en C ++

C ++ STL | Copia de un vector : Aprender – diferentes formas de copiar un vector de STL C ++, copia superficial vs profunda copiar, diferentes métodos de copia, etc.

En este artículo, vamos a ver cómo copia un vector en otro vector de diversas maneras? También vamos a aprender sobre copia superficial y copia profunda , sus diferencias, y las consecuencias durante la comprobación de cada uno de los métodos de copia del vector.

Antes de comenzar con los métodos class copiar un vector en el otro, vamos a discutir lo copia superficial y profunda son copia. ¿Cuáles son las diferencias b / w, y ¿por qué necesitamos dos términos diferentes para clasificar el proceso de copia.

copia superficial vs profundo copia

Un vector es esencialmente un objeto que tiene algunas de asignación de memoria después de la ejecución. Ahora dice que ha definido y declarado algún vector A y desea copiar el contenido de A en otro vector B. Ahora, no puede haber dos casos, uno es class definimos un nuevo vector B, pero no asigna ninguna nueva memoria for que, en lugar ponga el enlace hasta el vector a similar como vector B está apuntando en la misma ubicación del vector A. por lo tanto, tiene la misma copia del vector A. Esto se conoce como una copia superficial. Si hacemos cualquier cambio en el vector A, incluso después se lleva a cabo nuestra operación de copia, el vector B tendrá los mismos cambios que no están destinados.

Por otro lado, cuando se crea una nueva ubicación case vector B y copiar el contenido del vector de A, entonces se le conoce como copia profunda . Si hacemos algún cambio al vector A después de la operación de copia no se reflejará en el vector B, que es la intención del curso.

Mientras se discute el método de copia que detallaremos si se trata de una copia superficial o profunda copia y por qué para que nunca cometer ningún error utilizando el método de copiar y supongo que es una copia profunda ! (Sí que a menudo la intención de tener una copia profunda normalmente).

Diferentes métodos de copia

1) Copiar el contenido de forma iterativa

Aquí simplemente copiar el contenido de un vector en el vector B de forma iterativa. Vector B se define como una nueva ubicación, por lo que es, por supuesto, una copia profunda. Hemos comprobado que también cambiando los elementos después de nuestra operación de copia.

Ejemplo código:

#include <bits/stdc++.h>
using namespace std;
int main()
{
//vector A;
//a vector of 5 element where each
//element is -1
vector<int> A(5, -1);
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//vector B defined
vector<int> B;
//copy content iteratively
for (int i = 0; i < A.size(); i++) {
B.push_back(A[i]);
}
cout << "Vector A copied into vector Bn";
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
//to check deep copy or shallow copy
//changing one element in vector A
A[4] = 4;
cout << "After making the change...n";
//printing vector A
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//printing vector B
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
cout << "No change in B, it's deep copy!n";
return 0;
}

salida:

printing vector A:
-1 -1 -1 -1 -1
Vector A copied into vector B
printing vector B:
-1 -1 -1 -1 -1
After making the change...
printing vector A:
-1 -1 -1 -1 4
printing vector B:
-1 -1 -1 -1 -1
No change in B, it's deep copy!

2) contenido Copia recursivamente

Aquí simplemente copiar el contenido del vector A en el vector B de forma recursiva. Vector B se define como una nueva ubicación, por lo que es, por supuesto, una copia profunda. Hemos comprobado que también cambiando los elementos después de nuestra operación de copia.

código Ejemplo:

#include <bits/stdc++.h>
using namespace std;
//to copy recursively
//check reference is passed for vector B
void myrecur(int i, vector<int> A, vector<int>& B)
{
//base case
if (i == A.size())
return;
//copy content
B.push_back(A[i]);
myrecur(i + 1, A, B);
}
int main()
{
//vector A;
//a vector of 5 element where each
//element is -1
vector<int> A(5, -1);
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//vector B defined
vector<int> B;
//copy content iteratively
myrecur(0, A, B);
cout << "Vector A copied into vector Bn";
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
//to check deep copy or shallow copy
//changing one element in vector A
A[4] = 4;
cout << "After making the change...n";
//printing vector A
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//printing vector B
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
cout << "No change in B, it's deep copy!n";
return 0;
}

salida:

printing vector A:
-1 -1 -1 -1 -1
Vector A copied into vector B
printing vector B:
-1 -1 -1 -1 -1
After making the change...
printing vector A:
-1 -1 -1 -1 4
printing vector B:
-1 -1 -1 -1 -1
No change in B, it's deep copy!

3) Utilizando operador de asignación “=” (sobrescribiendo el contenido actual)

Otra manera de copiar un vector a otro es mediante el uso el operador de asignación. Sí, funciona perfectamente! No intente hacer esto en absoluto gama for for !. La razón de por qué tales operador de asignación funciona porque simplemente sobrescribe los miembros actuales, si alguna cesionarios disponibles, de lo contrario el valor desde donde se va a copiar. A continuación se muestra un ejemplo y podemos ver, se trata de una copia en profundidad.

Nota: En Java, operador de asignación hace un poco profunda copia única.

código Ejemplo:

#include <bits/stdc++.h>
using namespace std;
int main()
{
//vector A;
//a vector of 5 element where each
//element is -1
vector<int> A(5, -1);
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//vector B defined and copy A
//with assignment operator
vector<int> B = A;
cout << "Vector A copied into vector Bn";
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
//to check deep copy or shallow copy
//changing one element in vector A
A[4] = 4;
cout << "After making the change...n";
//printing vector A
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//printing vector B
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
cout << "No change in B, it's deep copy!n";
return 0;
}

de salida:

printing vector A:
-1 -1 -1 -1 -1
Vector A copied into vector B
printing vector B:
-1 -1 -1 -1 -1
After making the change...
printing vector A:
-1 -1 -1 -1 4
printing vector B:
-1 -1 -1 -1 -1
No change in B, it's deep copy!

4) El uso de constructor de copia

Podemos también pasar el vector A como un constructor de vector B que invocará constructor de copia y servir una copia profunda .

Ejemplo código:

#include <bits/stdc++.h>
using namespace std;
int main()
{
//vector A;
//a vector of 5 element where each
//element is -1
vector<int> A(5, -1);
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//vector B defined and vector
//A passed in the constructor
//this is also considered as an
//initialization method too
vector<int> B(A);
cout << "Vector A copied into vector Bn";
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
//to check deep copy or shallow copy
//changing one element in vector A
A[4] = 4;
cout << "After making the change...n";
//printing vector A
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//printing vector B
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
cout << "No change in B, it's deep copy!n";
return 0;
}

de salida:

printing vector A:
-1 -1 -1 -1 -1
Vector A copied into vector B
printing vector B:
-1 -1 -1 -1 -1
After making the change...
printing vector A:
-1 -1 -1 -1 4
printing vector B:
-1 -1 -1 -1 -1
No change in B, it's deep copy!

5) std :: copy () función

Hay otro método utilizando la copia función std (). Aunque es menos utilizado que debe saber una variedad de funciones de la biblioteca C ++ estándar tiene. Y sí, lo hace una copia profunda.
La función de copia de toma de tres argumentos

La primera de ellas es: iterador desde donde se iniciará la copia: a partir del vector A

El segundo es: iterador lugar en que se terminó la copia: el final del vector A

la tercera es: iterador de salida que puntos de vector destino: Inicio de vector B

Así que la sintaxis es,

void copy(argumnet1, argument2, argument3)

Ejemplo código:

#include <bits/stdc++.h>
using namespace std;
int main()
{
//vector A;
//a vector of 5 element where each
//element is -1
vector<int> A(5, -1);
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//vector B defined
vector<int> B(5);
//copy using std::copy
copy(A.begin(), A.end(), B.begin());
cout << "Vector A copied into vector Bn";
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
//to check deep copy or shallow copy
//changing one element in vector A
A[4] = 4;
cout << "After making the change...n";
//printing vector A
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//printing vector B
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
cout << "No change in B, it's deep copy!n";
return 0;
}

de salida:

printing vector A:
-1 -1 -1 -1 -1
Vector A copied into vector B
printing vector B:
-1 -1 -1 -1 -1
After making the change...
printing vector A:
-1 -1 -1 -1 4
printing vector B:
-1 -1 -1 -1 -1
No change in B, it's deep copy!

Una nota muy importante sobre el código anterior:

marque aquí he definido el vector B como vector & lt; for & gt; B (5), pero si nos fijamos en los códigos anteriores se encuentra que había definido como vector & lt; static & gt; B

Ahora la pregunta es por eso que hice el cambio de este tiempo. ¿Hay alguna razón o que acaba de hacer eso! De acuerdo, digamos que hacemos lo mismo que antes.

continuación, el código será:

#include <bits/stdc++.h>
using namespace std;
int main()
{
//vector A;
//a vector of 5 element where each
//element is -1
vector<int> A(5, -1);
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//vector B defined
vector<int> B;
//copy using std::copy
copy(A.begin(), A.end(), B.begin());
cout << "Vector A copied into vector Bn";
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
//to check deep copy or shallow copy
//changing one element in vector A
A[4] = 4;
cout << "After making the change...n";
//printing vector A
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//printing vector B
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
cout << "No change in B, it's deep copy!n";
return 0;
}

Salida:

printing vector A:
-1 -1 -1 -1 -1
Segmentation fault (core dumped)

Ups! La salida es fallo de segmentación! . ¿Por qué? Probablemente ahora usted consigue el punto. Siempre que escribimos vector & lt; int & gt; B el vector tiene ni idea de cuántos elementos estarán allí y que no asigna los elementos int memoria en absoluto. Sin embargo, en nuestra función de copia no es el iterador de salida que intenta atravesar el vector B, pero no como ninguna memoria asignada int elementos. Es por eso fallo de segmentación y tenemos que asignar memoria, en lugar decir definir el vector junto con sus elementos. Es por eso que necesitamos vector & lt; for & gt; B (5). Ir a través de mi artículo sobre métodos de vector de inicialización para conocer en detalles sobre esto. Vaya, un pequeño error puede conducir a la violación de segmento y es posible que acaba de obtener loco para encontrar el error! Niza esperanza lección.

6) vector :: Asignar (función)

Vector tiene una función incorporada demasiado para copiar el contenido de otros contenidos. Se llama la función de asignación (). Es de nuevo un método de copia de profundidad.

La sintaxis es como el de abajo,

destination_vector.assign (
iterator to the beginning of source_vector,
an iterator to the end of source_vector
);

Ejemplo código:

#include <bits/stdc++.h>
using namespace std;
int main()
{
//vector A;
//a vector of 5 element where each
//element is -1
vector<int> A(5, -1);
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//vector B defined
vector<int> B;
//copy using vector::assign
B.assign(A.begin(), A.end());
cout << "Vector A copied into vector Bn";
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
//to check deep copy or shallow copy
//changing one element in vector A
A[4] = 4;
cout << "After making the change...n";
//printing vector A
cout << "printing vector A:n";
for (auto it : A)
cout << it << " ";
cout << endl;
//printing vector B
cout << "printing vector B:n";
for (auto it : B)
cout << it << " ";
cout << endl;
cout << "No change in B, it's deep copy!n";
return 0;
}

de salida:

printing vector A:
-1 -1 -1 -1 -1
Vector A copied into vector B
printing vector B:
-1 -1 -1 -1 -1
After making the change...
printing vector A:
-1 -1 -1 -1 4
printing vector B:
-1 -1 -1 -1 -1
No change in B, it's deep copy!

bien, eso es todo. Por lo tanto, nos encontramos todos los métodos de copia realmente hacen un trabajo bueno como todos lo hacen copia en profundidad y podemos usar cualquiera de ellos ciegamente. Hacer comentario y háganos saber qué copia método que prefiere y por qué?


Deja un comentario

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