pair, tuple y Structured Binding en C++
Aprende pair, tuple y Structured Binding en C++ para gestionar múltiples valores con un código más limpio y moderno.
La biblioteca estándar de C++ ofrece los tipos pair y tuple para almacenar múltiples valores dentro de una misma estructura. Con C++17 se introdujo structured binding, que permite una forma mucho más legible y clara de extraer los valores de estas estructuras en variables separadas. Este artículo explica pair, tuple y structured binding en detalle mediante ejemplos prácticos.
1) ¿Qué es pair?
std::pair es una estructura sencilla que almacena dos valores que pueden ser de tipos distintos. Es muy útil cuando una función debe devolver dos valores simultáneamente.
- Contiene dos elementos:
firstysecond - Cada valor puede tener un tipo diferente
- Ideal para devolver múltiples valores desde una función
#include <utility>
#include <iostream>
using namespace std;
int main() {
pair<string, int> person("Ali", 30);
cout << person.first << ", " << person.second << endl;
}
Salida: Ali, 30
2) Uso de make_pair
auto p = make_pair("Ayse", 25);
cout << p.first << ", " << p.second;
3) Función que devuelve un pair
pair<int,int> getMinMax(int a, int b) {
return { min(a, b), max(a, b) };
}
int main() {
auto result = getMinMax(15, 40);
cout << "Min: " << result.first
<< ", Max: " << result.second;
}
4) ¿Qué es tuple?
std::tuple es una versión generalizada de pair y puede almacenar más de dos valores, incluso si todos son de tipos diferentes. Es ideal para agrupar datos heterogéneos.
#include <tuple>
#include <iostream>
using namespace std;
int main() {
tuple<string, int, double> student("Mehmet", 22, 3.40);
cout << get<0>(student) << endl;
cout << get<1>(student) << endl;
cout << get<2>(student) << endl;
}
5) Uso de make_tuple
auto data = make_tuple("Libro", 350, 49.90);
cout << get<0>(data) << endl;
cout << get<1>(data) << endl;
cout << get<2>(data) << endl;
6) Tamaño y tipos de un tuple
tuple<string, int, double> t;
cout << tuple_size<decltype(t)>::value << endl;
// tamaño del tuple = 3
// Obtener información del tipo
using T0 = tuple_element<0, decltype(t)>::type;
7) Structured Binding (C++17)
Structured binding permite extraer los valores de un tuple o un pair de una manera más clara, legible y moderna.
auto student = make_tuple("Zeynep", 21, 3.75);
auto [name, age, gpa] = student;
cout << name << " - " << age << " - " << gpa;
8) Structured Binding con pair
pair<string, int> book("C++", 450);
auto [title, pages] = book;
cout << title << " - " << pages;
9) Devolver un tuple desde una función
tuple<string,double,int> getProduct() {
return { "Laptop", 14500.99, 24 };
}
int main() {
auto [name, price, stock] = getProduct();
cout << name << ", "
<< price << ", "
<< stock;
}
10) Ejemplo práctico — Información de usuario
#include <tuple>
#include <iostream>
using namespace std;
tuple<string,int,string> getUser() {
return { "Ahmet", 28, "Ingeniero" };
}
int main() {
auto [name, age, job] = getUser();
cout << name << " (" << age << ") - " << job;
}
11) ¿Cuándo usar cada estructura?
- pair: cuando necesitas guardar exactamente dos valores.
- tuple: cuando necesitas guardar más de dos valores de distintos tipos.
- structured binding: cuando quieres una extracción clara y ordenada.
pair → estructura simple de dos valores
tuple → múltiples valores heterogéneos
structured binding → extracción legible y limpia
12) TL;DR
- pair: almacena dos valores (first, second).
- tuple: almacena múltiples valores de tipos distintos.
- structured binding: extrae pair/tuple en variables con nombres significativos.
- Todos los ejemplos funcionan correctamente en Visual Studio 2022 y GCC.
Artículos relacionados
Estructuras clave-valor con std::map y std::unordered_map en C++
Aprende a utilizar std::map y std::unordered_map en C++ para gestionar estructuras clave-valor de forma eficiente.
Iteradores y su uso en la STL de C++
Aprende los iteradores en C++ y su uso con contenedores y algoritmos STL para recorrer y manipular datos de forma eficiente.
Visión general de la biblioteca estándar de C++
Aprende la biblioteca estándar de C++, incluyendo contenedores STL, algoritmos y componentes esenciales del desarrollo moderno.