Vector (informática)En programación, se le denomina vector, formación, matriz[1][2] (en inglés array, del cual surge la mala traducción arreglo),[3] a una zona de almacenamiento contiguo que contiene una serie de elementos del mismo tipo, los elementos de la matriz.[4] Desde el punto de vista lógico una matriz se puede ver como un conjunto de elementos ordenados en fila (o filas y columnas si tuviera dos dimensiones). En principio, se puede considerar que todas las matrices son de una dimensión, la dimensión principal, pero los elementos de dicha fila pueden ser a su vez matrices (un proceso que puede ser recursivo), lo que nos permite hablar de la existencia de matrices multidimensionales, aunque las más fáciles de imaginar son las de una, dos y tres dimensiones. Definición objetivaUn vector (matriz) es una colección ordenada de datos (tanto primitivos u objetos dependiendo del lenguaje). Los vectores (matrices) se emplean para almacenar múltiples valores en una sola variable, frente a las variables que sólo pueden almacenar un valor (por cada variable). Estas estructuras de datos son adecuadas para situaciones en las que el acceso a los datos se realice de forma aleatoria e impredecible. Por el contrario, si los elementos pueden estar ordenados y se va a utilizar acceso secuencial sería más adecuado utilizar una lista, ya que esta estructura puede cambiar de tamaño fácilmente durante la ejecución de un programa, siendo esta última una estructura dinámica (al no tener un tamaño definido).[5][6][7][8] ÍndicesTodo vector se compone de un determinado número de elementos, lo cual lo hace que sea una estructura estática. Cada elemento es referenciado por la posición que ocupa dentro del vector. Dichas posiciones son llamadas índice y siempre son correlativos. Existen tres formas de indexar los elementos de una matriz:
NotaciónLa representación de un elemento en un vector se suele hacer mediante el identificador del vector seguido del índice entre corchetes, paréntesis o llaves:
Aunque muchas veces en pseudocódigo y en libros de matemática se representan como letras acompañadas de un subíndice numérico que indica la posición a la que se quiere acceder. Por ejemplo, para un vector "A": Forma de accesoLa forma de acceder a los elementos de la matriz es directa; esto significa que el elemento deseado es obtenido a partir de su índice y no hay que ir buscándolo elemento por elemento (en contraposición, en el caso de una lista, para llegar, por ejemplo, al tercer elemento hay que acceder a los dos anteriores o almacenar un apuntador o puntero que permita acceder de manera rápida a ese elemento). Para trabajar con vectores muchas veces es preciso recorrerlos. Esto se realiza por medio de bucles. La siguiente fuente escrita en el lenguaje C muestra un algoritmo típico para recorrer un vector '' y aplicar una función '' a cada una de las componentes del vector: int i = 0;
int longitud = 99; // longitud del vector Ej. 99
int V[longitud];
while(i < longitud) //Ej. con While
{
//Se realiza alguna operación con el vector en la i-ésima posición
f( V[i] );
//Se aumenta el índice para la siguiente etapa
i= i+1; // También podría escribirse como i++; o i+= 1;
}
Vectores dinámicos y estáticosLo habitual es que un vector tenga una cantidad fija de memoria asignada, aunque dependiendo del tipo de vector y del lenguaje de programación un vector podría tener una cantidad variable de datos. En este caso, se les denomina vectores dinámicos, en oposición, a los vectores con una cantidad fija de memoria asignada se los denomina vectores estáticos.[9] El uso de vectores dinámicos requiere realizar una apropiada gestión de memoria dinámica. Un uso incorrecto de los vectores dinámicos, o mejor dicho, una mala gestión de la memoria dinámica, puede conducir a una fuga de memoria. Al utilizar vectores dinámicos siempre habrá que liberar la memoria utilizada cuando esta ya no se vaya a seguir utilizando. Lenguajes más modernos y de más alto nivel, cuentan con un mecanismo denominado recolector de basura (como es el caso de Java) que permiten que el programa decida si debe liberar el espacio basándose en si se va a utilizar en el futuro o no un determinado objeto. Ejemplos en Cint main(void)
{
int i, v[5]; // v[5] es un vector de 5 componentes (Indexación base-cero)
for(i=0; i<5; i++)
{
v[i] = 0; // Asignamos un valor
printf("%d\n", v[i]);
printf("\n"); // Crea una nueva línea
}
return 0;
}
Siendo el identificador del vector, un puntero constante que contiene la dirección del comienzo del vector (vector[0], primer elemento) int main(void)
{
int i, v[5]; // v[5] es un vector de 5 componentes (Indexación base-cero)
for(i=0; i<5; i++)
{
*(v + i) = 0; // Asignamos un valor en la dirección (vector + ((índice * sizeof (int) cantidad de bytes de desplazamiento desde la base.)
printf("%d\n", *(v + i));
printf("\n"); // Crea una nueva línea
}
return 0;
}
#include <vector>
vector<int> v; // Si no se especifica el tamaño inicial es 0
for(int i=0 ;i<5 ;i++)
{
v.push_back(2*i); // inserta un elemento al final del vector
}
El ejemplo anterior está hecho para el lenguaje C++. Para crear vectores dinámicos en C, se tendrían que reservar manualmente la memoria (utilizando la familia de funciones: malloc, realloc y free).
#include <stdlib.h>
#include <string.h>
typedef struct Array {
int *elements;
size_t len;
size_t capacity;
} Array;
void array_push(Array *array, int elem) {
if (array->len >= array->capacity) {
array->capacity = array->capacity > 0 ? array->capacity * 2 : 8;
array->elements = realloc(array->elements, array->capacity * sizeof(int));
}
array->elements[array->len++] = elem;
}
int array_at(Array *array, size_t index) {
return array->elements[index];
}
void array_remove(Array *array, size_t index) {
int *src = &array->elements[index + 1];
int *dst = &array->elements[index];
size_t n = array->len - index;
memmove(dst, src, n);
}
void array_free(Array *array) {
free(array->elements);
*array = (Array){0};
}
int main(void) {
Array array = {0};
for (int i = 0; i < 5; i++)
array_push(&array, 2 * i);
array_free(&array);
}
Resultado:
El resultado de los dos ejemplos anteriores es el mismo vector. Vectores multidimensionalesEn Basic, Java y otros lenguajes es posible declarar matrices multidimensionales, entendiéndolas como un vector de x dimensión. En dichos casos el número de elementos del vector es el producto resultante de cada dimensión. Por ejemplo, el vector v(4,1) tiene 10 elementos, y se calcula del siguiente modo: (0-4) * (0-1). La primera dimensión del vector contiene 5 elementos que van del '0' al '4', y la 2.ª dimensión tiene 2 elementos que van del '0' al '1'. Los elementos serían accedidos del siguiente modo:
Véase también
Referencias
|