¡Domina los Vectores en C++! Guía Definitiva para Declarar y Usar Vectores Fácilmentepost-template-default single single-post postid-46 single-format-standard et_pb_button_helper_class et_fixed_nav et_show_nav et_secondary_nav_enabled et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db
771 715 4434

Cuando trabajamos con colecciones de variables o datos en programación, usualmente los guardamos en un tipo de dato específico. En C++, podemos almacenarlos en arreglos, estructuras, vectores, cadenas de texto, entre otros. Los vectores o arreglos de una dimensión son una estructura de datos fundamental en C++ que nos permite almacenar múltiples valores en una única variable.

Los arrays (arreglos) y los vectores son tipos de datos que nos permiten almacenar y gestionar de forma conjunta múltiples valores del mismo tipo. En un aspecto más profundo, este tipo de arrays (vectores), permiten almacenar muchos valores en posiciones de memoria contiguas, lo cual permite acceder a un valor u otro de manera rápida y sencilla. En múltiples ocasiones es necesario almacenar gran cantidad de información en una variable y a menudo sucede que no conocemos con exactitud la cantidad de datos que debemos almacenar, pero sabemos que sí sería más de uno, como por ejemplo almacenar las identificaciones de las personas ingresadas al sistema.

Declaración de vectores en C++

Para declarar un vector en C++, se deben seguir las mismas normas básicas que se siguen para declarar una variable cualquiera, con un pequeño cambio en la sintaxis. Necesitaremos saber el tipo de los datos que irán al interior de este (números enteros, decimales, cadenas de texto, etc.), un nombre para el vector, y un tamaño máximo. Es necesario ingresar con antelación la cantidad de datos (tamaño) que el vector o la matriz tendrá, a diferencia de algunos otros lenguajes de programación, los vectores y las matrices presentan un "inconveniente" con el tamaño, no es posible crear de una manera sencilla un vector capaz de almacenar una cantidad de información indefinida.

La sintaxis para declarar un vector es la siguiente:

vector  nombre_de_vector;

Cada nuevo vector debe ser declarado usando la palabra clave vector, seguido por el tipo de dato que queremos almacenar encerrado entre paréntesis angulares (el vector puede contener varios tipos de datos: cadenas, enteros, caracteres, etc.), por último debemos especificar el nombre del vector, el cual puede ser cualquiera que nosotros decidamos, aunque siempre es conveniente utilizar nombres que hagan nuestro código lo más legible posible. Cabe aclarar que debemos escribir la directiva #include al inicio del archivo para poder usar los vectores.

Lea también: IVA 21% Excel

Vectores de tamaño fijo (arrays)

Para declarar un vector, arreglo o como lo quieras llamar, necesitaremos saber el tipo de los datos que irán al interior de este, es decir, serán número enteros, o número decimales o cadenas de texto, etc. necesitamos también, como siempre, un nombre para el vector y un tamaño máximo. Tenemos entonces, tal como mencioné antes, que para declarar un vector en C++, debemos definirle un tipo de los datos, sea entero, float, string, etc., debemos darle un nombre y al interior de los corchetes "[]" debemos poner el tamaño máximo que tendrá el vector, es decir la cantidad máxima de datos que podrá contener (recuerda que en C++ esto es necesario hacerlo).

En el ejemplo, declaramos en la línea 1 un vector llamado v que tiene un tamaño de 2 elementos.

int v[2];

Para poder acceder a cada uno de los elementos del vector (para usarlos o para asignarles un valor) es necesario especificar el nombre del vector y la posición del elemento entre corchetes tal y como vemos en las líneas 3 y 4.

El arreglo del código de ejemplo fue creado y reservo en memoria el espacio suficiente para contener solo 3 elementos, en el caso de que quisiéramos agregar nuevos elementos generando un nuevo índice, nos daría como resultado un error. Por defecto, al declarar un vector sin ser inicializado, cada una de las casillas de este vector toma como valor el valor por defecto del tipo de variable, para el caso de los enteros (int) es -858993460.

Vectores dinámicos con std::vector

Con los vectores, las cosas son un poquito diferente, cuando lo definimos, no tenemos que especificar la capacidad que tendrá, tras bambalinas, el espacio en memoria del vector se modifica al mismo tiempo que cambia el tamaño del vector. Si buscas cómo crear vectores de tamaño dinámico o matrices de tamaño dinámico, te recomiendo ver la sección de Punteros en C++.

Lea también: Guía IVA reducido

Inicialización de vectores en C++

Declarar un vector es diferente de inicializarlo. Declararlo significa crear un nuevo vector, mientras que inicializarlo es insertarle elementos en él. En esta sección, veremos las diferentes maneras de inicializar un vector en C++, las dividiremos en subsecciones con su respectivo ejemplo.

Inicialización al mismo tiempo que se declara

Al igual que con los arreglos, podemos asignar valores al vector al momento que lo declaramos. Podemos especificar el tamaño y la información que contendrá el vector al momento de declararlo.

Aquí hemos declarado un vector de tipo string tamaño 5 y lo hemos inicializado con diferentes valores, es necesario notar que cada valor va entre comillas dobles "" puesto que son strings.

std::vector miVector = {"Hola", "Mundo", "C++", "Programacion", "Ejemplo"};

En el ejemplo anterior asignamos 5 valores enteros en la declaración del vector v1. Asignamos 3 valores en la declaración del vector v2 que en este caso es de tipo float.

Es necesario especificar el tamaño del vector en el momento de su declaración, ya sea explícitamente entre corchetes o bien mediante una lista de valores que le asignamos. En ocasiones puede suceder que no conozcamos el número de elementos que vamos a manejar en el momento de la declaración. Siempre cabe la posibilidad de declarar un vector de un tamaño muy grande y utilizar luego solo una parte del mismo.

Lea también: ¿Cómo localizar tus XML del SAT?

Inicialización usando el método push_back()

push_back() es uno de los varios métodos que podemos usar para interactuar con los vectores. Añade un elemento al final del vector.

En el ejemplo, declaramos el vector, miVector usando la sentencia vector miVector;. Luego, usando el método push_back() le insertamos tres valores (5, 10, 15). Finalmente, usando un bucle for, iteramos en el vector para mostrar en consola los valores.

#include #include int main() { std::vector miVector; miVector.push_back(5); miVector.push_back(10); miVector.push_back(15); for (int valor : miVector) { std::cout << valor << std::endl; } return 0;}

Dadas las características de C++, es fácil pensar que es factible crear o declarar un vector de un tamaño cualquiera y posteriormente inicializarlos de forma habitual como se muestra en este código, sin embargo hacer esto es un error, si declaramos un vector y no lo inicializamos inmediatamente, no es posible inicializarlo de la forma que hemos visto, es decir entre llaves cada valor, como en la línea 2 del código anterior. La única forma de inicializar el vector, o mejor dicho, darle valores a cada una de sus casillas, es hacerlo uno por uno, es decir darle un valor a la casilla cero a la uno y a la 2 (para un vector de tamaño 3).

Vectores de tamaño estático: especificando el tamaño y el valor contenido

Podemos especificar el tamaño y la información que contendrá el vector al momento de declararlo. Por ejemplo, podemos inicializar un vector con 5 elementos, todos ellos con el valor 0:

std::vector miVector(5, 0); // Vector de 5 enteros, todos inicializados a 0

En este caso, 5 es el número de elementos inicial en la declaración, y 0 es el valor con el que se inicializarán todos esos elementos.

Obteniendo y manipulando datos en un vector

Ya tenemos claro cómo declarar un array o vector en C++, algunas características un tanto particulares de estos, sin embargo, aún no sabemos cómo obtener los datos de un array, es decir, una vez el array o vector esté lleno con los elementos que queremos, cómo podemos obtener esa información y más aún, cómo obtener un valor específico dentro del array.

Recorriendo un vector

Para obtener todos los datos que se encuentran al interior de un vector, es necesario recorrer el array o vector. Para recorrerlo, se usa casi siempre un ciclo for, en algunos casos más específicos un ciclo while, pero generalmente el ciclo for es el ideal para esto, dado que conocemos el tamaño del array.

En el ejemplo anterior se utiliza un for para recorrer el vector. En la variable i se van generando los valores desde 0 hasta 4, que son los índices de los valores almacenados en el vector (5 datos).

#include #include int main() { std::vector numeros = {10, 20, 30, 40, 50}; // Recorrer el vector usando un bucle for tradicional for (int i = 0; i < numeros.size(); ++i) { std::cout << "Elemento en el índice " << i << ": " << numeros[i] << std::endl; } // Recorrer el vector usando un bucle for basado en rango (C++11 o superior) for (int numero : numeros) { std::cout << "Elemento: " << numero << std::endl; } return 0;}

Determinando el tamaño de un vector

A veces no es posible determinar con facilidad el tamaño exacto de un vector, pero en C++ existen varias formas de determinar el tamaño de un array o vector fácilmente, aquí explicaré un método. El operador sizeof en C++, retorna el tamaño en bytes del elemento que se indica. En este caso, como es un array, indica el tamaño total de ese array en bytes. Como el tipo de dato int tiene un tamaño de 4 bytes, un array de 12 elementos de tipo int tendrá 48 bytes. Luego, el tamaño del primer elemento (o cualquiera de ellos) será 4. Así, 48 dividido entre 4 es 12, que es el tamaño de nuestro array.

#include int main() { int v1[] = {1, 2, 3, 4, 5}; // Array de 5 enteros int s1 = sizeof(v1[0]); // Tamaño del primer elemento (int) int s2 = sizeof(v1); // Tamaño del array completo en bytes int num_elementos = s2 / s1; // Número de elementos std::cout << "Tamaño de un int: " << s1 << " bytes" << std::endl; std::cout << "Tamaño del vector v1: " << s2 << " bytes" << std::endl; std::cout << "Número de elementos en v1: " << num_elementos << std::endl; return 0;}

Para vectores de std::vector, se utiliza el método .size() para obtener el número de elementos actuales.

Funciones útiles para vectores

En la librería string.h existen algunas funciones que son útiles para inicializar vectores (memset), para copiar vectores (memcpy) y para comparar vectores entre sí (memcmp).

  • memset(vector, valor, tamaño_en_bytes): Esta función inicializa un vector con el valor que deseemos. Cuando declaramos un vector, el contenido de este son valores aleatorios que existen en la memoria del ordenador en el espacio que le es asignado. A la función memset tenemos que pasarle un primer argumento que es el nombre del vector, un segundo argumento que es el valor con el cual queremos rellenarle y un tercer argumento que es el tamaño en bytes que queremos rellenar.
  • memcpy(destino, origen, tamaño_en_bytes): A la función memcpy tenemos que pasarle un primer argumento que es el vector destino de la copia, un segundo argumento que es el vector origen y un tercer argumento que es el tamaño en bytes que queremos copiar. Para copiar los datos de un vector en otro vector no podemos realizar una asignación directa del tipo v1 = v2.
  • memcmp(vector1, vector2, tamaño_en_bytes): A la función memcmp tenemos que pasarle como argumentos los dos vectores que deseamos comparar y un tercer argumento que es el tamaño en bytes de elementos que queremos comparar.

Pasar vectores a funciones

Cuando definimos una función que acepta un vector como parámetro, en la definición del parámetro pondremos el equivalente a una declaración normal del vector. A la hora de pasar a una función elementos individuales de un vector, se aplican las mismas normas que cuando pasamos variables. Se pueden pasar por valor cuando son datos de entrada o por referencia (el puntero) cuando son datos de salida.

#include #include // Función para imprimir un vectorvoid imprimirVector(const std::vector& vec) { for (int valor : vec) { std::cout << valor << " "; } std::cout << std::endl;}// Función para cambiar el valor de dos elementos (paso por referencia)void cambiar(int& a, int& b) { int temp = a; a = b; b = temp;}int main() { std::vector numeros = {1, 2, 3, 4, 5}; imprimirVector(numeros); // Pasar el vector por referencia constante // Pasar elementos individuales por referencia cambiar(numeros[0], numeros[1]); imprimirVector(numeros); return 0;}

Ejemplo práctico: Almacenar títulos y autores de libros

Vamos a solucionar un problema simple: queremos crear un programa con el cual podamos guardar los títulos y los autores de diferentes libros sin perder ninguno de ellos. El usuario es el encargado de suministrar la información de cada libro. Vamos a suponer que el usuario solo podrá ingresar un máximo de 5 libros, para así tener un tamaño de vector fijo.

#include #include #include  // Necesario para usar std::string#include  // Necesario para std::numeric_limitsint main() { const int MAX_LIBROS = 5; std::vector titulos(MAX_LIBROS); std::vector autores(MAX_LIBROS); std::cout << "Ingrese la información para " << MAX_LIBROS << " libros:" << std::endl; for (int i = 0; i < MAX_LIBROS; ++i) { std::cout << "Libro " << (i + 1) << ":" << std::endl; std::cout << "Título: "; std::getline(std::cin >> std::ws, titulos[i]); // Usar std::ws para ignorar el salto de línea anterior std::cout << "Autor: "; std::getline(std::cin >> std::ws, autores[i]); } std::cout << "\n--- Libros ingresados ---" << std::endl; for (int i = 0; i < MAX_LIBROS; ++i) { std::cout << "Libro " << (i + 1) << ":" << std::endl; std::cout << " Título: " << titulos[i] << std::endl; std::cout << " Autor: " << autores[i] << std::endl; } return 0;}

Puedes ver que los únicos cambios necesarios fueron importar la librería string y poner los tipos de datos como string en vez de char y eso solucionó por completo nuestro problema.

En la versión del ejemplo anterior teníamos un problema un poco delicado, y es que cuando ingresamos el título del libro o el autor de este con espacios, es decir, más de una palabra (habitualmente es así) el objeto cin interpreta esto como un fin de línea y no nos solicita el siguiente valor. Para solucionar esto haremos uso de la función getline que nos permite solucionar este tipo de problemas. Esta función nos permite leer líneas completas, incluyendo espacios.

tags: #como #declarar #el #tamaño #de #un