Eliminar elementos
Parte de la sección Lógica y Flujo del Journey de C++ de Coddy — lección 16 de 56.
A veces necesitas eliminar elementos de un vector cuando ya no son necesarios. Los vectores requieren que uses un iterador con el método .erase(). Puedes combinar std::find() con .erase() para eliminar elementos por valor.
Aquí tienes cómo eliminar un elemento de un vector:
std::vector<int> numbers = {10, 20, 30, 40};
auto it = std::find(numbers.begin(), numbers.end(), 20);
if (it != numbers.end()) {
numbers.erase(it); // Elimina el elemento en la posición del iterador
}Después de llamar a erase(), el elemento en esa posición se elimina y todos los elementos posteriores se desplazan hacia abajo. Si intentas buscar y eliminar un elemento que no existe, find() devolverá end(), y comprobar esto evita errores.
Este patrón hace que la eliminación de elementos sea segura y predecible. Es particularmente útil para mantener colecciones dinámicas donde necesites eliminar elementos específicos basados en la entrada del usuario o la lógica del programa. Recuerda comprobar siempre si el iterador es válido antes de borrar.
Desafío
FácilCrea un programa que demuestre cómo eliminar elementos de un std::vector utilizando el método .erase() combinado con std::find(). Este desafío pondrá a prueba tu comprensión sobre cómo eliminar de forma segura elementos específicos de un vector y observar los resultados.
Se proporcionarán las siguientes entradas:
- Un número entero
nque representa la cantidad de elementos que se añadirán inicialmente al vector - Luego,
nnúmeros enteros para ser insertados en el vector - Un número entero
mque representa la cantidad de elementos a eliminar - Luego,
mnúmeros enteros que representan los elementos a eliminar del vector
Tu programa debe:
- Crear un
std::vector<int>vacío - Leer la cantidad de elementos a añadir e insertarlos en el vector usando
.push_back() - Imprimir el tamaño inicial del vector después de todas las inserciones
- Leer la cantidad de elementos a eliminar
- Para cada elemento a eliminar, usa
std::find()para localizarlo, luego usa.erase()para eliminarlo si se encuentra - Después de cada intento de eliminación, imprime el tamaño actual del vector
- Finalmente, itera a través de los elementos restantes en el vector e imprímelos en orden
Utiliza el siguiente formato de salida exacto:
Tamaño inicial del vector:
Initial size: [size]Después de cada intento de eliminación:
After removing [number]: size = [current_size]Elementos finales restantes:
Remaining elements: [element1] [element2] [element3] ...Recuerda que .erase() requiere un iterador, por lo que primero debes usar std::find() para localizar el elemento. Siempre verifica si el elemento fue encontrado antes de borrarlo. Usa un bucle for basado en rangos (range-based for loop) para imprimir los elementos restantes en su orden actual.
Hoja de referencia
Usa std::find() combinado con .erase() para eliminar un elemento específico de un vector:
std::vector<int> numbers = {10, 20, 30, 40};
auto it = std::find(numbers.begin(), numbers.end(), 20);
if (it != numbers.end()) {
numbers.erase(it); // Elimina el elemento en la posición del iterador
}Comprueba siempre si el iterador no es igual a end() antes de borrar para evitar un comportamiento indefinido. El método .erase() requiere un iterador, no un valor directamente.
Pruébalo tú mismo
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// Leer el número de elementos a añadir
int n;
cin >> n;
// Crear un vector vacío
vector<int> myVector;
// Leer e insertar n elementos
for (int i = 0; i < n; i++) {
int element;
cin >> element;
// Insertar elemento en el vector
}
// Leer el número de elementos a eliminar
int m;
cin >> m;
// TODO: Escribe tu código abajo
// 1. Imprimir el tamaño inicial del vector
// 2. Para cada elemento a eliminar, búscalo y usa .erase() e imprime el tamaño después de cada eliminación
// 3. Imprimir los elementos restantes en el vector
return 0;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Punteros y memoria
¿Qué es un puntero?Operador de direcciónOperador de desreferenciaPunteros nulosPunteros y arraysMemoria dinámica con 'new'Liberar memoria con 'delete'Resumen: Práctica de punteros2Vectores (Arrays dinámicos)
Introducción a std::vectorCreación de un VectorAgregar elementosAcceder a los elementosTamaño del VectorIterar con un bucle ForBucle For basado en rangosEliminar elementosResumen - Operaciones con Vectores5Proyecto: Herramienta de inventario
Configuración del proyectoAgregar y actualizar artículos3Proyecto: Herramienta de lista de tareas
Descripción general del proyectoAñadir una tarea