Contenedores en C++: Uso y Funcionalidades de std::vector

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";
}

Etiquetas: std::vector C++ contenedores iteradores Memoria Dinámica

Publicado el 10-19 20:21