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 la gestión manual de índices 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.
Es posible que notes el símbolo & en la declaración del bucle — const std::string& name. En este contexto, & no significa "dirección de" como habrás visto antes. Aquí declara name como una referencia (un alias) directamente a cada elemento en el vector, en lugar de hacer una copia del mismo. Piénsalo como darle un nuevo nombre al mismo fragmento de datos — similar a usar un puntero al elemento, 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. El alias en sí mismo sigue avanzando hacia cada nuevo elemento con cada iteración; es el contenido al que estás accediendo a través del alias lo que se mantiene constante, no la progresión del bucle.
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 añadir 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 exactamente el siguiente formato de salida:
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.
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