2012-06-19 13 views
8

Esta es la misma pregunta que se hace en C# pero lo necesito para C++¿Cómo puedo copiar una parte de una matriz a otra matriz en C++?

¿Cómo puedo copiar una parte de una matriz a otra matriz?

Considérese que estoy teniendo

int[] a = {1,2,3,4,5}; 

Ahora si me dan el índice inicial y el índice final de la matriz una que debe conseguir copiado a otra matriz.

Me gusta si doy el índice de inicio como 1 y el índice final como 3, los elementos 2, 3, 4 deben copiarse en la nueva matriz.

En C# se ha hecho lo siguiente

 int[] b = new int[3]; 
    Array.Copy(a, 1, b, 0, 3); 

¿Hay alguna manera sencilla como esta para hacer la misma tarea en C++?

+3

Mejor aún, use 'std :: vector' en lugar de las matrices en primer lugar. Tiene un constructor que hace lo que estás haciendo, entre muchas otras características excelentes. – chris

Respuesta

10

Sí, utilizar std::copy:

std::copy(a + src_begin_index, 
      a + src_begin_index + elements_to_copy, 
      b + dest_begin_index); 

El equivalente de su C# ejemplo sería:

std::copy(a + 1, a + 4, b); 
+2

¡Solo asegúrese de no desbordar los límites de su destino! –

+2

Gracias @ RichardJ.RossIII. Funciona muy bien. –

+1

Iría por 'copy_n' ...'std :: copy_n (a + src_begin_index, elements_to_copy, b + dst_begin_index)' –

0

Para simples matrices de tipo C se puede utilizar memcpy:

memcpy(b, &a[1], sizeof(int) * 3); 

Esta línea copia sizeof(int) * 3 bytes (es decir, 12 bytes) del índice 1 de a, con b como destino.

1

Existe la Cmemcpy de comandos, que se puede utilizar de esta manera:

memcpy(destinationArray, sourceArray, sizeof(*destinationArray) * elementsToCopy); 

También existe std::copy, que es una forma más C++ forma de hacerlo:

std::copy(source, source + elementsInSource, destination); 

Nota que ni de estas funciones, verifique para asegurarse de que se ha asignado suficiente memoria, ¡utilice bajo su propio riesgo!

+0

El uso de 'std: copy' es incorrecto, ya que el segundo argumento debe ser one-past-the-end (' source + elementsInSource') , sin el -1 –

+0

@DaveS bien, gracias. No he usado C++ desde hace un tiempo, así que gracias por señalarlo. –

0

Sí, utilizando st algoritmo biblioteca estándar copy:

#include <algorithm> 

int main() 
{ 
    int array[5] = { 1,2,3,4,5 }; // note: no int[] array 
    int *b = new int[3]; 
    std::copy(array+1, array+4, b); 
    // copies elements 1 (inclusive) to 4 (exclusive), ie. values 2,3,4 
} 
2

Suponiendo que desea una matriz asignada dinámicamente, como en el ejemplo de C#, la forma más sencilla es:

std::vector<int> b(a.begin() + 1, a.begin() + 4); 

Esto también tiene la ventaja de que liberará automáticamente la memoria asignada cuando se destruya; Si usa new usted mismo, entonces también necesitará usar delete para evitar pérdidas de memoria.

Cuestiones relacionadas