Original article: C++ Vector – How to Initialize a Vector in a Constructor in C++

Cuando estás trabajando con una colección de variables o de datos en programación, usualmente los guardas en un tipo de dato específico.

En C++, puedes guardarlos en arreglos, estructuras, vectores, cadenas de texto y la lista sigue. Si bien estas estructuras de datos tiene sus características distintivas, en este artículo nos vamos a concentrar en los múltiples métodos para inicializar vectores.

Pero antes, hablemos un poco de los vectores y que los hace destacarse cuando trabajamos con colecciones en C++.

¿Qué son los vectores en C++?

A diferencia de los arreglos, donde la memoria es asignada de forma estática, los vectores nos permiten crear estructuras de datos más dinámicas.

Este es un ejemplo de un arreglo en C++:

#include <iostream>
using namespace std;

int main() {
    string nombres[3] = {"Nicolas", "Matias", "Tomas"};
    cout << nombres[1] << endl;
    // Matias
}
 

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.

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.

Sintaxis de los vectores en C++

Declarar un vector es diferente de inicializarlo, Declararlo significa crear un nuevo vector, mientras que inicializarlo es insertarle elementos en él.

Así es como se ve la sintaxis de un vector:

vector <tipo_de_dato> 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 y la lista sigue), 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 <vector> al inicio del archivo para poder usar los vectores.

Cómo inicializar un vector en C++

En esta sección, veremos las diferentes maneras de inicializar un vector en C++, las dividiremos en subsecciones con su respectivo ejemplo.

Comencemos con la manera más básica.

Cómo inicializar un vector en C++ usando el método push_back()

push_back() es uno de los varios métodos que podemos usar para interactuar con los vectores. Push_back() toma el parámetro que le demos y lo inserta en el índice final del vector.

Aquí tenemos un ejemplo:

#include <iostream>
#include <vector>
using namespace std;

int main() {
	//declaramos el vector "miVector"
    vector<int> miVector;
	//ahora, inicializamos el vector usando push_back()
	miVector.push_back(5);
	miVector.push_back(10);
	miVector.push_back(15);

	for (int x : miVector)
		cout << x << " ";
		// 5 10 15 
}

En el ejemplo, declaramos el vector, miVector usando la sentencia vector<int> 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.

Como inicializar un vector al mismo tiempo que lo declaramos

Al igual que con los arreglos, podemos asignar valores al vector al momento que lo declaramos.

Veamos el siguiente ejemplo:

#include <iostream>
#include <vector>
using namespace std;

int main() {
	//declaramos e inicializamos el vector miVector
    vector<int> miVector{ 5, 10, 15 };

	for (int x : miVector)
		cout << x << " ";
		// 5 10 15 
}

En este ejemplo, en la misma línea declaramos e inicializamos el vector.

Una vez que los números son asignados al vector, lo recorremos y, posteriormente, los imprimimos en consola.

Habrá notado, que entre paréntesis angulares encerré el tipo de dato que podrá contener el vector, en este caso el tipo es entero int.

Cómo inicializar un vector con un arreglo

Esta vez, inicializaremos el vector con los valores contenidos en un arreglo creado con anterioridad, para esto, utilizaremos dos métodos de la clase vector: begin() y end().

Veamos como es que estos métodos funcionan:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    //Creamos el arreglo que contiene los datos que luego asignaremos al vector
    int miArreglo[] = { 5, 10, 15 };
    //Definimos el vector miVector y, mediante los metodos begin() y end() asignamos el contenido del arreglo que definimos con anterioridad
    vector<int> miVector(begin(miArreglo), end(miArreglo));


	for (int x : miVector)
		cout << x << " ";
		// 5 10 15 
}

Así como utilizamos un arreglo para generar un vector, podemos utilizar los dos métodos vistos en el ejemplo para copiar los valores de un vector hacia otro.

Vectores de tamaño estático: Como inicializar un vector, 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. Esto nos permitirá que el vector tenga un tamaño y un valor específico a través de la ejecución del código.

Aquí te muestro un ejemplo:

#include <iostream>
#include <vector>
using namespace std;

int main() {

  int cantidad_de_elementos = 5; 
  
  vector<int> miVectorFijo(cantidad_de_elementos, 2); 
  
  	for (int x : miVectorFijo)
		cout << x << " ";
// 		2 2 2 2 2 
}

En el ejemplo, primero definimos una variable cantidad_de_elementos = 5, el cual especifica la cantidad de elementos máximos que contendrá el vector.

Luego, declaramos el vector miVectorFijo pasándole 2 parámetros: el primero corresponde al número máximo de elementos que el vector contendrá, mientras que el segundo corresponde al valor que contendrá el vector.

Finalmente, iteramos con un bucle for para poder imprimir en pantalla el contenido del vector, por lo que nos imprimirá 5 veces 2.

Cómo inicializar un vector usando el constructor de una  clase

Podemos inicializar vectores en constructores de clases, de esta forma podemos hacer que la clase sea más dinámica y, no tengamos que programar manualmente los valores del vector al inicializar la clase.

Veamos un ejemplo:

#include <iostream>
#include <vector>
using namespace std;

class Vector {
	vector<int> miVector;

public:
	Vector(vector<int> newVector) {
	    miVector = newVector;
	}
	
	void imprimirVector() {
		for (int i = 0; i < miVector.size(); i++)
			cout << miVector[i] << " ";
	}
	
};

int main() {

    vector <int> vectorNuevo;
    
	vectorNuevo.push_back(5);
	vectorNuevo.push_back(10);
	vectorNuevo.push_back(15);
	
	Vector vector(vectorNuevo);
	vector.imprimirVector();
	// 5 10 15 
}

Vamos a analizar el ejemplo:

class Vector {
	vector<int> miVector;

public:
	Vector(vector<int> newVector) {
	    miVector = newVector;
	}
	
	void imprimirVector() {
		for (int i = 0; i < miVector.size(); i++)
			cout << miVector[i] << " ";
	}
	
};

Primero, creamos la clase Vector, luego creamos una variable de tipo vector a la cual llamamos miVector.

Luego, definimos el constructor de la clase, el cual tiene dos métodos: uno que toma el vector inicializado y otro que imprime en pantalla los valores contenidos en el vector.

int main() {
    vector <int> vectorNuevo;
    
	vectorNuevo.push_back(5);
	vectorNuevo.push_back(10);
	vectorNuevo.push_back(15);
	
	Vector vector(vectorNuevo);
	vector.imprimirVector();
	// 5 10 15 
}

Luego, en el bloque main, creamos un nuevo vector, le insertamos los valores 5,10 y 15.

Finalmente, imprimimos por pantalla el contenido del vector con el método imprimirVector(), el cual fue definido en la clase que creamos anteriormente.

Lo interesante del ejemplo, es que los métodos fueron definidos en la clase, por lo que, no debemos preocuparnos del tamaño del vector (el cual es obtenido por la clase).

Conclusiones

En este artículo, hablamos sobre los vectores en C++, comenzamos diferenciando los arreglos de los vectores (recuerde, que los arreglos tienen un tamaño estático, mientras que los vectores tienen un tamaño dinámico, aunque, en caso de que sea necesario ese tamaño puede ser definido para que también sea estático).

Luego, trabajamos con algunos métodos que podemos utilizar para inicializar el vector y mostramos ejemplos de cada método (nuevamente, recuerde que no es lo mismo declarar que inicializar, declarar es crear en memoria el vector, e inicializar es asignarle valores a ese vector).

¡Que tengas un gran día programando (y aprendiendo)!