Bucle For basado en rangos
Parte de la sección Lógica y Flujo del Journey de C++ de Coddy — lección 15 de 56.
Si bien los bucles for tradicionales con índices funcionan bien para iterar a través de vectores, C++ ofrece una solución más elegante: el bucle for basado en rangos. Esta sintaxis moderna elimina la necesidad de gestionar los índices manualmente y hace que su código sea más limpio y fácil de leer.
El bucle for basado en rangos maneja automáticamente los detalles de la iteración por ti. En lugar de gestionar una variable de índice, simplemente especificas lo que quieres hacer con cada elemento:
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
for (const std::string& name : names) {
std::cout << name << std::endl;
}Este bucle hace exactamente lo mismo que el enfoque tradicional basado en índices, pero con una sintaxis mucho más sencilla. La variable name toma automáticamente el valor de cada elemento del vector, uno a la vez.
Observa el
& en const std::string& name. Aquí, & no significa "dirección de" como habrás visto antes; en una declaración de variable como esta, significa referencia (o alias). En lugar de copiar cada elemento, name se convierte en un alias que se refiere directamente al elemento en el vector, de forma similar a usar un puntero pero sin necesidad de desreferenciarlo dentro del cuerpo del bucle.La palabra clave
const es una medida de seguridad: evita que modifiques accidentalmente el elemento a través del alias dentro del cuerpo del bucle, manteniendo los datos originales del vector sin cambios.El bucle for basado en rangos no solo es más legible sino también más seguro: no hay riesgo de errores de índice, ya que no se gestionan los índices manualmente. Funciona con cualquier contenedor que admita la iteración, lo que lo convierte en una herramienta versátil para procesar colecciones de datos en C++.
Desafío
FácilCrea un programa que demuestre el bucle for basado en rangos procesando una colección de nombres de ciudades y mostrándolos con sus respectivos conteos de caracteres.
Se proporcionarán las siguientes entradas:
- Un entero
nque representa el número de ciudades - Luego
ncadenas que representan los nombres de las ciudades
Tu programa debe:
- Crear un
std::vector<std::string>llamadocities - Usar
push_back()para agregar cada uno de losnnombres de ciudades al vector - Usar un bucle for basado en rangos para iterar a través del vector
- Para cada ciudad en el bucle, imprimir el nombre de la ciudad seguido de su longitud utilizando el método
.length() - Después del bucle, imprimir el número total de ciudades procesadas utilizando el método
.size()del vector
Utiliza el siguiente formato de salida exacto:
City: [city name] (Length: [number of characters])\nCity: [city name] (Length: [number of characters])\n...\nTotal cities processed: [total count]El bucle for basado en rangos debe usar la sintaxis for (const std::string& city : cities) para iterar a través de cada elemento en el vector. Usa city.length() para obtener el número de caracteres en cada nombre de ciudad.
Hoja de referencia
El bucle for basado en rangos itera a través de un contenedor sin gestión manual de índices:
std::vector<std::string> names = {"Alice", "Bob", "Charlie"};
for (const std::string& name : names) {
std::cout << name << std::endl;
}&declaranamecomo una referencia (alias) a cada elemento — sin copiasconstevita la modificación accidental del elemento dentro del cuerpo del bucle- Funciona con cualquier contenedor que admita la iteración
Pruébalo tú mismo
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
// Leer el número de ciudades
int n;
cin >> n;
// Crear un vector para almacenar los nombres de las ciudades
vector<string> cities;
// Leer los nombres de las ciudades y añadirlos al vector
for (int i = 0; i < n; i++) {
string city;
cin >> city;
cities.push_back(city);
}
// TODO: Escribe tu código a continuación
// Usa un bucle for basado en rangos para iterar a través del vector de ciudades
// Imprime cada ciudad con su longitud usando el formato especificado
// Después del bucle, imprime el número total de ciudades procesadas
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