Constructores de std::vector
El contanedor std::vector ofrece múltiples formas de inicialización. El constructor por defecto no recibe parámetros y crea una instancia vacía en tiempo constante.
#include <vector>
std::vector<int> vec1; // Constructor vacío
El constructor de copia permite crear un nuevo vector a partir de otro existente:
std::vector<int> vec2(vec1); // Copia todos los elementos
Para crear un vector con un número específico de elementos, se puede usar:
std::vector<int> vec3(5, 42); // Cinco elementos con valor 42
Además, es posible construir un vector a partir de un rango de iteradores:
std::vector<int> vec4{1, 2, 3, 4, 5};
auto it_start = vec4.begin();
auto it_end = vec4.end();
std::vector<int> vec5(it_start, it_end);
Operadores de Comparación y Acceso
Los operadores como ==, !=, <, > permiten comparar vectores de forma lexicográfica. El acceso directo mediante corchetes [] es constante:
std::vector<int> data{10, 20, 30};
std::cout << data[1]; // Muestra 20
Se recomienda usar at() para verificar límites y evitar desbordamientos:
try {
std::cout << data.at(5); // Lanza std::out_of_range si el índice está fuera de rango
} catch (const std::out_of_range& e) {
std::cout << "Índice inválido";
}
Métodos de Mainpulación de Contenido
El método assign() reemplaza el contendio actual del vector:
vec1.assign(3, 99); // Tres elementos con valor 99
vec1.assign(vec2.begin(), vec2.end()); // Copiar desde otro vector
Para obtener referencias al primer y último elemento, se usan front() y back():
std::cout << vec1.front(); // Primer elemento
std::cout << vec1.back(); // Último elemento
Iteradores y Rango de Elementos
Los métodos begin() y end() devuelven iteradores que delimitan el rango de elementos:
for (auto it = vec1.begin(); it != vec1.end(); ++it) {
std::cout << *it << ' ';
}
El iterador rend() y rbegin() permiten recorrer el vector en orden inverso:
for (auto rit = vec1.rbegin(); rit != vec1.rend(); ++rit) {
std::cout << *rit << ' ';
}
Gestión de Memoria y Rendimiento
La función reserve() ajusta la capacidad sin modificar el tamaño actual:
vec1.reserve(100); // Asegura espacio para 100 elementos
resize() cambia el tamaño real del vector, insertando valores predeterminados si es necesario:
vec1.resize(8, 0); // Aumenta a 8 elementos, llenos con 0
vec1.resize(3); // Reduce a 3 elementos, eliminando los restantes
Operaciones Avanzadas
erase() elimina elementos en una posición o rango:
vec1.erase(vec1.begin() + 2, vec1.begin() + 5); // Elimina elementos 2 a 4
insert() permite añadir elementos en una posición específica:
vec1.insert(vec1.begin() + 3, 2, 77); // Inserta dos veces el valor 77 en la posición 3
swap() intercambia contenidos entre dos vectores en tiempo constante:
vec1.swap(vec2);
Información Estática del Contenedor
Funciones como size(), capacity() y max_size() proporcionan detalles sobre el estado del vector:
std::cout << "Tamaño: " << vec1.size() << '\n';
std::cout << "Capacidad: " << vec1.capacity() << '\n';
std::cout << "Máximo posible: " << vec1.max_size() << '\n';
clear() elimina todos los elementos, mientras que empty() verifica si el vector está vacío:
if (vec1.empty()) {
std::cout << "Vector vacío";
}