Cargando...

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.


#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 → 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