std::vector en C++: La Colección Dinámica Moderna
En la lección anterior descubrimos que los arreglos fijos requieren controlar manualmente la capacidad (inventario[9]), contar los elementos ocupados (cantidadInventario) y desplazar la memoria a mano al borrar. Con std::vector todo eso queda resuelto de forma automática, segura y con memoria dinámica.
1. La Gran Evolución: De Arreglo Fijo a std::vector
Para usar vectores en C++ debemos incluir la cabecera estándar #include <vector>. Observa la dramática simplificación:
string inventario[9];
int cantidadInventario = 6;- Capacidad fija en tiempo de compilación.
- No puede crecer más allá de 9 casillas.
- El programador debe gestionar el contador de ocupación.
vector<string> inventario;- Crece y decrece automáticamente en tiempo de ejecución.
- Desaparece
cantidadInventario: se consulta coninventario.size(). - Reorganiza y administra la memoria interna por ti.
Podemos inicializar el vector con los 9 objetos iniciales o dejarlo vacío:
2. Inserción Dinámica con push_back(): Superando el Límite de 9
¿Qué ocurre si el jugador recoge un décimo objeto (ej. "Manzana")? En el arreglo fijo recibíamos un error de desbordamiento. Con vector, simplemente llamamos al método push_back():
3. Eliminación Automática con erase()
En arreglos tradicionales teníamos que programar un bucle manual para mover todos los elementos de la derecha una posición hacia la izquierda. Con std::vector, el método .erase() se encarga de todo el desplazamiento en una sola línea:
for (int i = pos; i < n - 1; i++) {
inventario[i] = inventario[i + 1];
}
n--;// Borra el elemento en la posición y reorganiza todo inventario.erase(inventario.begin() + posicion);
inventario.begin()?Es un iterador que apunta al inicio del vector (índice 0). Al sumarle
+ 2, apunta exactamente al tercer elemento (índice 2) para que erase lo elimine.4. Tabla de Métodos Esenciales de std::vector
Estas son las operaciones que utilizarás en el 99% de tus programas en C++:
| Método | Descripción | Ejemplo |
|---|---|---|
| .size() | Retorna la cantidad actual de elementos en el vector. | int total = inventario.size(); |
| .empty() | Retorna true si el vector no tiene elementos (tamaño 0). | if (inventario.empty()) cout << "Vacio"; |
| .push_back(val) | Inserta un elemento al final de la colección. | inventario.push_back("Diamante"); |
| .pop_back() | Elimina el último elemento del vector. | inventario.pop_back(); |
| .erase(pos) | Elimina el elemento en la posición dada y ajusta los índices. | inventario.erase(inventario.begin() + 1); |
| .clear() | Elimina todos los elementos, dejando el vector con tamaño 0. | inventario.clear(); |
| .front() / .back() | Devuelve el primer o el último elemento respectivamente. | cout << inventario.front(); |
| .at(pos) | Acceso con validación de límites (lanza excepción si está fuera de rango). | string item = inventario.at(2); |
5. Modularización: Funciones con vector<string>&
Al pasar vectores a funciones en C++, existen dos reglas de oro para maximizar el rendimiento y evitar copias costosas:
const vector<string>&Se pasa por referencia constante. Evita duplicar el vector en memoria y garantiza que la función no modifique los datos por error (ideal para mostrarInventario y buscarObjeto).
vector<string>&Se pasa por referencia mutable. Permite que funciones como agregarObjeto, eliminarObjeto o modificarObjeto alteren directamente el vector del main.
6. Programa Completo: CRUD de Inventario Dinámico en C++
Este es el código completo con menú interactivo utilizando std::vector. Cópialo y pruébalo en tu compilador:
7. Cuadro Comparativo Definitivo: Arreglo vs. std::vector
Usa esta guía rápida para decidir cuándo conviene usar un arreglo tradicional o un std::vector:
| Aspecto | Arreglo Estático (T[]) | std::vector<T> |
|---|---|---|
| Tamaño | Fijo en compilación (ej. string inv[9]). | Dinámico: crece y se achica según la necesidad. |
| Ubicación de Memoria | Stack (rápido, pero limitado en tamaño). | Heap (memoria dinámica administrada automáticamente). |
| Inserción al final | Manual: inv[cnt++] = x; (con riesgo de overflow). | Automática: inv.push_back(x); |
| Eliminación en medio | Requiere bucle manual de desplazamiento. | Directa: inv.erase(inv.begin() + i); |
| Saber cuántos hay | Requiere variable adicional (cantidadInventario). | Directo con inv.size(). |
| Recomendación | Para tamaños pequeños y estrictamente constantes conocidos de antemano. | La opción estándar por defecto en C++ moderno. |


