Vectores y matrices en c++

Los vectores y las matrices son objetos contenedores, esto significa que contienen otros objetos de un tipo de dato específico. (Es una variable que contiene otras variables)

Para  poder usar los vectores y las matrices es necesario incorporar la biblioteca vector:

#include <vector>

Vectores

Para entender mejor cómo son los vectores, lo veremos con esta forma:

Cada cuadrado es una posición de memoria donde guardaremos una variable de un tipo específico.

Las variables de tipo vector han de tener un tipo de dato específico, un nombre y un tamaño (número de variables) y para declararlas lo haremos con la siguiente sintaxis:

vector <‘tipo de dato’> ‘nombre'(‘numero de variables’) 

Ejemplos de sintaxis de un vector:

vector<int> v(4)   // v es un vector de 4 posiciones de enteros (0..3).

vector <int> c(v)  // c es una copia de v.

vector<bool> b(4,true)   // b es un vector de 4 posiciones de booleanos inicializados a true.

Para poder acceder a una posición de memoria de un vector lo haremos de la siguiente forma:

v[0]=2  /* De esta forma accederemos a la primera posición de memoria del vector y podremos asignarle el valor que queramos como por ejemplo el numero «2»  */

Para poder recorrer el vector asignando valores se suele usar bucles como el while o el for.

for(int i=0;i<5;++i){

cin >> v[i] ;

}

/*usamos la variable «i» para poder ir cambiando de posición de memoria a cada iteracion del bucle

Hay muchas funciones que puedes usar en los vectores, las más importantes son:

  • vector = vector2  // Asigna los valores de un vector a otro (copia)
  • vector.size() // Devulve el número de elementos de un vector
  • vector.swap(vector2) // Intercambia el contenido de los vectores

Ejemplo programa:

El programa pedirá el número de elementos de una secuencia numérica y seguidamente la secuencia, el programa ha de imprimir por pantalla dicha secuencia pero invertida.

En esta solución recorreremos el vector empezando por la última posición hasta llegar a la primera introduciendo la secuencia numérica. De esta forma cuando recorramos el bucle para imprimir ya estarán a la inversa.

#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;

cin >> n;
vector inv(n);
for(int i=n-1;i>=0;–i){

cin >> inv[i] ;

}
for(int i=0;i<n;++i){

cout << inv[i];
if(i!=n-1){

cout << » «;

}
}

cout << endl;

}

Otra solución sería hacer exactamente lo mismo pero, en vez de introducirlos de final a principio del bucle y luego haciendo una lectura normal, lo que haríamos es introducirlos normalmente y luego leyendo el vector a la inversa.

Matrices

Las matrices no dejan de ser vectores pero en vez de contener enteros, booleanos, etc., lo que contienen son otros vectores los cuales contendrán algún tipo de dato (int, char, bool..).

Ahora veremos el vector principal de la matriz así:

Lo veremos en forma de una columna, porque el vector que contendrá será la fila.

Formando un objeto parecido a una tabla. Donde cada cuadrado sera una posición de memoria del vector interior dentro de una posición de memoria del vector exterior.

 

 

Para que quede más claro cuando me refiero a un vector interior o exterior vamos a ver como se declara y se accede a la posición de memoria.

Crearemos la estructura de la matriz justo después de incluir las librerías y fuera del main para poderla usar en las diferentes funciones y procedimientos del programa.

typedef vector< vector<int> > Matrix;

Una vez creada la estructura de la matriz, la declaramos en el main.

 Matrix m(x, vector <int> (y));

// Matrix es el nombre de la estructura de la matriz
// m Sera el nombre de la matriz
// x sera las columnas
// y seran las filas

 

Para acceder a los espacios de la matriz tenemos que tener en cuenta que ahora necesitaremos saber la columna y la fila donde queremos acceder.

m[0][0] = 1 // Esto guardara el valor 1 en la primera posición de memoria de la matriz

m[2][1] = 2 // Esto guardara el valor de 2 en la posición de memoria situada en la 3a fila 2 columna. (ten en cuenta que se empieza a contar desde el 0)

Normalmente acederas a las posiciones de memoria usando bucles, por ejemplo:

Como tendrás que recorrer filas y columnas deberás usar un doble bucle.

For ( i=0; i < 5 ;++i ){  // Este primer bucle recorrerá las filas

For ( j=0; j < 5 ;++i ){ // Este segundo bucle recorrerá las columnas de cada fila

cin >> m[i][j];

}

}

Ejemplo:

Este programa comprobara si una matriz cuadrada es simétrica o no y mostrara el resultado por pantalla.

Para ello hemos dividido el programa en 2 partes, el main donde crearemos y introduciremos los valores a la matriz y una función que nos dirá con un valor booleano si es o no simétrica.

#include <iostream>
#include <vector>
using namespace std;
typedef vector< vector<int> > Matriz;

bool es_simetrica(const Matriz& m){ // función que nos devolverá si la matriz es simétrica

for(int i=0;i<m.size();++i){

for(int j=0;j<m.size();++j){

if(m[i][j]!=m[j][i]) return false; // comparación de los valores de la matriz

}

}

return true;
}

int main(){

int n;
cin >> n ;
Matriz m(n,vector <int>(n));
for(int i=0;i<n;++i){

for(int j=0;j<n;++j){

cin >> m[i][j];

}

}

if( es_simetrica(m)) cout << «si»;
else cout << «no»;

}

En la función «es_simetrica» usaremos un doble bucle para recorrer la matriz y en el irá comprobando que las posiciones contrarias a ella sean iguales, en el caso que no lo fuera acabaría el bucle y devolvería el resultado como «false» sino seguiría comprobando hasta acabar el bucle y devolver el valor «true».

Para mostraros de forma más clara cómo sería una matriz simétrica y otra que no, veamos estos ejemplos:

[su_row][su_column]

1 2 1
2 1 2
1 2 1

[/su_column] [su_column]
Esto es una matriz simétrica porque ambos lados de la matriz son iguales[/su_column] [/su_row]
[su_row][su_column]

1 2 3
1 2 3
1 2 3

[/su_column]

[su_column]
No es lo mismo esto que el caso anterior, esta no sería simétrica porque si comprobamos las diagonales no son iguales porque, por ejemplo, la posicion m[0][2] es diferente a m[2][0].

[/su_column][/su_row]

Este algoritmo que hemos creado para comprobar si la matriz es simétrica no es óptimo (pero es sencillo, que es lo que buscamos para esta toma de contacto con matrices). Con la práctica podréis optimizarlo un poco y hacer toda clases de programas que requieran recorridos, búsquedas y ordenación en vectores y matrices.

En el próximo tutorial hablaré de estructuras (struct) en c++.

1 comentario en «Vectores y matrices en c++»

Deja un comentario