Cómo revertir una matriz C ++

Cómo revertir una matriz C ++
Considere la siguiente matriz: Char Arrf [] = 'm', 'n', 'o', 'p', 'q';

El reverso de esta matriz es:

char arrr [] = 'q', 'p', 'o', 'n', 'm';

Los caracteres se vuelven en orden inverso, en el inicializador_list. Tenga en cuenta que en el orden inverso, la carta, 'O' permanece en su posición. Esto se debe a que el número de elementos en la matriz es impar.

Considere ahora la siguiente matriz:

char arrf [] = 'l', 'm', 'n', 'o', 'p', 'q';

El reverso de esta matriz es:

char arrr [] = 'q', 'p', 'o', 'n', 'm', 'l';

Los caracteres se vuelven en orden inverso, en el inicializador_list. Esta vez, los dos elementos intermedios se intercambian porque el número de elementos en la matriz es incluso.

Hay varias formas de revertir la matriz, y este artículo explora esas formas.

Contenido del artículo

- Introducción - Ver arriba

- Usando una matriz adicional para revertir

- Matriz inversa al intercambiar elementos

- Reversión de matriz utilizando una función recursiva

- Uso de std :: reverse ()

- Conclusión

Usando una matriz adicional para revertir

Con este método, cree otra matriz del mismo tipo y tamaño que la matriz original pero vacía. A continuación, lea la primera matriz desde la parte posterior y cabe en los elementos en la segunda matriz desde el frente usando un bucle for-bucle. El siguiente programa ilustra esto:

#incluir
usando el espacio de nombres STD;
int main ()

char arrf [] = 'm', 'n', 'o', 'p', 'q';
int size = sizeof (arrf)/sizeof (arrf [0]); // Obtener el tamaño de la matriz
Char Arrr [tamaño];
para (int i = 0, j = size-1; j> = 0; i ++, j--)
arrr [i] = arrf [j];

para (int i = 0; icout<
cout<regresar 0;

La salida es:

Q P o n m

La primera declaración en la función principal de C ++ crea la primera matriz sin indicar el tamaño. La segunda declaración obtiene el tamaño dividiendo el tamaño total de la matriz en bytes por el tamaño del primer elemento de la matriz (después de todo, todos los elementos de una matriz C ++ son del mismo tipo). La siguiente declaración crea la segunda matriz del mismo tipo y tamaño, pero vacía.

El segmento de código después es el for-loop. El for-bucle copia el último elemento de la primera matriz y lo pone en la primera posición de la segunda matriz. Copia el último pero un elemento de la primera matriz y se pone en la segunda posición de la segunda matriz. Copia el tercer elemento de la primera matriz y coloca en la tercera posición de la segunda matriz y hasta el índice variable, que está "subiendo" la segunda matriz alcanza el último elemento de la segunda matriz en el índice tamaño-1. Índice, J "Mueve hacia abajo" la primera matriz de tamaño-1 a 0. Me mueve por la segunda matriz mientras J baja la primera matriz.

En las paréntesis del for-bucle, yo y J se declaran en la primera declaración. Mientras J sea mayor o igual a cero, la copia continuará, es decir, la condición. El incremento de I y la disminución de J, forman la última declaración entre paréntesis.

El último bucle imprime los elementos de la segunda matriz.

Matriz inversa al intercambiar elementos

Los últimos y primeros elementos se pueden intercambiar por la única matriz. Los últimos y segundos elementos se pueden cambiar por esta misma matriz. El tercer y tercer elemento se puede intercambiar y hasta que el punto medio de la matriz esté alcanzado y se detiene el intercambio. Si el número de elementos es impar, el elemento medio no cambia su posición. Si el número de elementos es uniforme, entonces hay dos elementos medios que se intercambian.

Nuevamente, hay dos variables de índice: I y J pero para una sola matriz. Estoy incrementado y J está disminuido para cada iteración hasta que casi se encuentran. La condición de tiempo para esto es (yo < j). The following program, illustrates this method:

#incluir
usando el espacio de nombres STD;
int main ()

char arr [] = 'm', 'n', 'o', 'p', 'q';
int size = sizeof (arr)/sizeof (arr [0]);
para (int i = 0, j = size-1; i< j; i++,j--)
char temp = arr [i];
arr [i] = arr [j];
arr [j] = temp;

para (int i = 0; icout<
cout<regresar 0;

La salida es:

Q P o n m

Reversión de matriz utilizando una función recursiva

Una función recursiva es una función que sigue llamando a sí misma hasta que se cumple una condición. Esto se explica mejor con un ejemplo. Considere la siguiente parte superior del programa:

#incluir
usando el espacio de nombres STD;
char arr [] = 'm', 'n', 'o', 'p', 'q';
int siz = sizeof (arr)/sizeof (arr [0]);
vacío reversarray (char arr [], int i)
// condición base
if (i == siz)
devolver;
Char elemento = arr [i]; // elemento de extracción
Reversar Ray (arr, i+1); // llamada recursiva
arr [siz-i-1] = elemento; //rastrear

Se declara la matriz y el tamaño de la matriz se determina como Siz (sin E). Después de eso en el código es la definición de función recursiva. El primer segmento de código en la función (if construye) es la condición a cumplir. La I es la variable de índice para acceder a los elementos de matriz desde el índice 0 al índice SIZ-1. Cuando soy igual a Siz, la función regresa y deja de llamarse a sí misma.

La función principal de C ++ tiene la llamada,

Reversarray (arr, 0);

Esto llama a la función recursiva con dos argumentos: el primero es el nombre de la matriz; el segundo es el índice inicial para i, cero.

Cuando la función se llama la primera vez, 'M' se asigna a una ubicación en la memoria identificada por elemento. Después de esa declaración, la función se llama nuevamente dentro de la función con "Reversarray (arr, i+1);". La última declaración en la función no ha sido atendida a. Esta vez la función se llama con i = 1; y 'n' se asigna a una ubicación de memoria diferente, aún identificada por el elemento.

La tercera vez se llama la función, i = 2; y 'O' se asigna a una tercera ubicación de memoria todavía identificada BYREM Element. La cuarta vez se llama la función, i = 3; y 'P' se asigna a una cuarta ubicación de memoria, la remuntación identificada por el elemento. La quinta vez que se llama la función, i = 4; y 'Q' se asigna a una quinta ubicación de memoria todavía identificada por el elemento.

La sexta vez se llama la función, i = 5, que es el tamaño de la matriz y la función regresa debido a la construcción if. Todo esto mientras, la última declaración en la función no ha sido atendida para. Esta última declaración es:

arr [siz-i-1] = elemento;

Con esta declaración, lo que sea que el elemento tenga en cuenta, se asigna a una posición de matriz. Recuerde que hay cinco ubicaciones en la memoria con el elemento identificador que contiene los caracteres: 'm', 'n', 'o', 'p', 'q', en ese orden.

Es cierto que la función ha vuelto nula, pero la última declaración aún debe ser ejecutada, cinco veces. Para cada llamada de la función, la última declaración se registró una vez, en la memoria. La primera vez que se ejecuta, Siz -i -1 = 5 - 0 - 1 = 4; en la llamada para la cual regresa la función, pero usando el primer índice. Y entonces,

arr [4] = 'Q'
yendo hacia atrás. La segunda vez que se ejecuta la última declaración, Siz -I -1 = 5 - 1 - 1 = 3. Y entonces,
arr [3] = 'P'
La tercera vez que se ejecuta la última declaración, Siz -I -1 = 5 - 2 - 1 = 2. Y entonces,
arr [2] = 'O'
La cuarta vez que se ejecuta la última declaración, Siz -I -1 = 5 - 3 - 1 = 1. Y entonces,
arr [1] = 'n'
La quinta y última vez que se ejecuta la última declaración, Siz -I -1 = 5 - 4 - 1 = 0. Y entonces,
arr [0] = 'm'

Y así, la matriz se ha revertido con una función recursiva.

Uso de std :: reverse ()

El std :: reverse () de la biblioteca de algoritmo también se puede usar para revertir una matriz, aunque no es obvio. Para usar esta función, la biblioteca de algoritmo debe incluirse en el programa. El prototipo para la función es:

plantilla
constexpr void reverse (bidireccionaliterador primero, bidireccionaliterator último);

El primer argumento es un iterador que señala el primer elemento de un contenedor. El segundo argumento es otro iterador que señala justo después del último elemento del contenedor. Un puntero al primer elemento de la matriz se puede usar como el primer argumento. Un puntero que apunta justo después del último elemento de la matriz puede usarse como el segundo argumento.

Si el nombre de la matriz es ARR, entonces es un puntero al primer elemento ARR. Un puntero que apunta justo después del último elemento de la matriz es "ARR + tamaño", donde el tamaño es el tamaño de la matriz. El siguiente programa muestra cómo se puede usar std :: reverse () para revertir una matriz:

#incluir
#incluir
usando el espacio de nombres STD;
char arr [] = 'm', 'n', 'o', 'p', 'q';
int siz = sizeof (arr)/sizeof (arr [0]); // Tamaño de la matriz
int main ()

reverso (arr, arr+siz);
para (int i = 0; icout<
cout<regresar 0;

La salida es:

Q P o n m

Conclusión

Se puede realizar una reversión de una matriz, utilizando una matriz adicional, intercambiando elementos de matriz, utilizando una función recursiva o utilizando std :: reverse ().