DMarlon Studio

Lección 16 · 16 de 20

Pares y enlaces estructurados · C++

Agrupe dos valores con std::pair en C++, devuélvalos juntos desde una función y sepárelos con los enlaces estructurados de C++17.

C++ · Pares y enlaces estructurados en DMarlon Studio: el código del ejemplo y su salida en la terminal

`std::pair` guarda dos valores juntos, que pueden ser de tipos distintos: un producto y su precio. Se accede a ellos con `first` y `second`. Está en <utility>.

`std::make_pair` crea un par deduciendo los tipos a partir de los valores, sin necesidad de escribirlos.

Una función devuelve un solo valor, pero ese valor puede ser un par: minMax devuelve a la vez la temperatura mínima y la máxima con return {lo, hi};.

Los enlaces estructurados de C++17, auto [coldest, hottest] = minMax(week);, dan un nombre a cada parte del par. Se lee mucho mejor que result.first y result.second.

Donde más se agradecen es al recorrer un map, cuyos elementos son pares: for (const auto& [player, count] : goals) saca el nombre y los goles de cada jugador, por orden alfabético.

Código · main.cpp

#include <iostream>#include <map>#include <string>#include <utility>#include <vector>// A function can return two results inside a pair.std::pair<int, int> minMax(const std::vector<int>& values) {    int lo = values[0], hi = values[0];    for (int v : values) {        if (v < lo) lo = v;        if (v > hi) hi = v;    }    return {lo, hi};}int main() {    // A pair holds two values, which may have different types.    std::pair<std::string, double> product = {"Headphones", 59.99};    std::cout << product.first << " cost " << product.second << " euros\n";    auto city = std::make_pair("Valencia", 26);  // make_pair deduces the types    std::cout << city.first << ": " << city.second << " C\n";    // Structured bindings give a name to each part.    std::vector<int> week = {19, 24, 17, 28, 22};    auto [coldest, hottest] = minMax(week);    std::cout << "This week: from " << coldest << " to " << hottest << " C\n";    // They are very handy to go through a map.    std::map<std::string, int> goals = {{"Lola", 7}, {"Iker", 12}, {"Sara", 9}};    for (const auto& [player, count] : goals) std::cout << player << " scored " << count << '\n';    return 0;}

Salida · c++ -std=c++17 main.cpp -o main && ./main

Headphones cost 59.99 euros
Valencia: 26 C
This week: from 17 to 28 C
Iker scored 12
Lola scored 7
Sara scored 9

Para recordar

  • std::pair<A, B> guarda dos valores; se leen con first y second.
  • std::make_pair(a, b) deduce los tipos.
  • Una función puede devolver dos resultados en un par.
  • auto [a, b] = par; da nombre a cada parte.
  • for (const auto& [clave, valor] : mapa) recorre un map.

Ejercicio

Escriba una función que reciba un std::vector<int> de notas y devuelva un std::pair con la nota media (double) y el número de aprobados (5 o más), y recoja el resultado con un enlace estructurado.