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.

`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 confirstysecond.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 unmap.
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.