Bucle for basado en rango en C++

Jinku Hu 12 octubre 2023
  1. Utilice el bucle for basado en rangos para imprimir elementos de std::map en C++
  2. Utilice el bucle for basado en rangos para imprimir miembros de struct en C++
Bucle for basado en rango en C++

Este artículo demostrará varios métodos sobre cómo utilizar un bucle for basado en rangos en C++.

Utilice el bucle for basado en rangos para imprimir elementos de std::map en C++

El bucle for basado en rangos es un equivalente más legible del bucle for normal. Se puede utilizar para recorrer el array o cualquier otro objeto que tenga funciones miembro begin y end. Tenga en cuenta que usamos la palabra clave auto y la referencia al elemento para acceder a él. En este caso, el item se refiere al elemento único de std::map, que resulta ser del tipo std::pair. Por lo tanto, acceder a los pares clave-valor requiere una notación especial de puntos para acceder a ellos utilizando palabras clave first/second.

#include <iostream>
#include <map>

using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;

int main() {
  map<int, string> fruit_map = {{
                                    1,
                                    "Apple",
                                },
                                {
                                    2,
                                    "Banana",
                                },
                                {
                                    3,
                                    "Mango",
                                },
                                {
                                    4,
                                    "Cocoa",
                                }};

  for (auto &item : fruit_map) {
    cout << "[" << item.first << "," << item.second << "]\n";
  }

  return EXIT_SUCCESS;
}

Producción :

[1,Apple]
[2,Banana]
[3,Mango]
[4,Cocoa]

Alternativamente, un bucle basado en rango puede acceder a elementos usando notación de enlace estructurado y hacer que el bloque de código sea más conciso. En el siguiente ejemplo, demostramos dicho uso de enlace para acceder a pares std::map.

#include <iostream>
#include <map>

using std::cin;
using std::cout;
using std::endl;
using std::map;
using std::string;

int main() {
  map<int, string> fruit_map = {{
                                    1,
                                    "Apple",
                                },
                                {
                                    2,
                                    "Banana",
                                },
                                {
                                    3,
                                    "Mango",
                                },
                                {
                                    4,
                                    "Cocoa",
                                }};

  for (const auto& [key, val] : fruit_map) {
    cout << "[" << key << "," << val << "]\n";
  }

  return EXIT_SUCCESS;
}

Producción :

[1,Apple]
[2,Banana]
[3,Mango]
[4,Cocoa]

Utilice el bucle for basado en rangos para imprimir miembros de struct en C++

El enlace estructurado puede ser extremadamente útil cuando los elementos atravesados ​​representan estructuras relativamente más grandes con varios miembros de datos. Como se muestra en el siguiente código de ejemplo, estos miembros se declaran como una lista de identificadores y luego se hace referencia a ellos directamente sin la notación struct.member. Tenga en cuenta que la mayoría de los contenedores STL se pueden atravesar utilizando el bucle for basado en rangos.

#include <iostream>
#include <list>

using std::cin;
using std::cout;
using std::endl;
using std::list;
using std::string;

struct Person {
  string name;
  string surname;
  int age;
};

int main() {
  list<Person> persons = {{"T", "M", 11},
                          {"R", "S", 23},
                          {"J", "R", 43},
                          {"A", "C", 60},
                          {"D", "C", 97}};

  for (const auto& [n, s, age] : persons) {
    cout << n << "." << s << " - " << age << " years old" << endl;
  }

  return EXIT_SUCCESS;
}

Producción :

T.M - 11 years old
R.S - 23 years old
J.R - 43 years old
A.C - 60 years old
D.C - 97 years old
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Loop