Chargement...

pair, tuple et Structured Binding en C++

Apprenez pair, tuple et le Structured Binding en C++ pour manipuler plusieurs valeurs avec un code moderne et lisible.

La bibliothèque standard C++ fournit les types pair et tuple pour stocker plusieurs valeurs dans une seule structure. Avec C++17, le structured binding a été introduit, permettant une extraction beaucoup plus lisible et intuitive des valeurs contenues dans ces structures. Cet article explique en détail les concepts de pair, tuple et structured binding avec des exemples pratiques.


1) Qu’est-ce que pair ?

std::pair est une structure simple qui contient deux valeurs, éventuellement de types différents. Il est particulièrement utile lorsque l’on souhaite retourner deux valeurs depuis une fonction.


#include <utility>
#include <iostream>
using namespace std;

int main() {
    pair<string, int> person("Ali", 30);

    cout << person.first << ", " << person.second << endl;
}

Sortie : Ali, 30


2) Utiliser make_pair


auto p = make_pair("Ayse", 25);
cout << p.first << ", " << p.second;

3) Fonction retournant 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’est-ce que tuple ?

std::tuple est une version généralisée de pair, capable de contenir plus de deux valeurs, même si elles sont toutes de types différents. C’est une solution idéale pour regrouper plusieurs données hétérogènes.


#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) Utilisation de make_tuple


auto data = make_tuple("Livre", 350, 49.90);

cout << get<0>(data) << endl;
cout << get<1>(data) << endl;
cout << get<2>(data) << endl;

6) Taille et informations de type d’un tuple


tuple<string, int, double> t;

cout << tuple_size<decltype(t)>::value << endl;
// taille du tuple = 3

// Extraction du type
using T0 = tuple_element<0, decltype(t)>::type;

7) Structured Binding (C++17)

Le structured binding offre une manière beaucoup plus propre et lisible d’extraire les valeurs d’un tuple ou d’un pair dans des variables individuelles.


auto student = make_tuple("Zeynep", 21, 3.75);

auto [name, age, gpa] = student;

cout << name << " - " << age << " - " << gpa;

8) Structured Binding avec pair


pair<string, int> book("C++", 450);

auto [title, pages] = book;

cout << title << " - " << pages;

9) Retourner un tuple depuis une fonction


tuple<string,double,int> getProduct() {
    return { "Ordinateur", 14500.99, 24 };
}

int main() {
    auto [name, price, stock] = getProduct();

    cout << name << ", " 
         << price << ", " 
         << stock;
}

10) Exemple pratique — Informations utilisateur


#include <tuple>
#include <iostream>
using namespace std;

tuple<string,int,string> getUser() {
    return { "Ahmet", 28, "Ingénieur" };
}

int main() {
    auto [name, age, job] = getUser();

    cout << name << " (" << age << ") - " << job;
}

11) Quand utiliser quelle structure ?

pair → structure simple à deux valeurs
tuple → valeurs multiples et hétérogènes
structured binding → extraction claire et lisible


12) TL;DR

  • pair : stocke deux valeurs (first, second).
  • tuple : stocke plusieurs valeurs de différents types.
  • structured binding : décompose pair/tuple en variables lisibles.
  • Tous les exemples fonctionnent sous Visual Studio 2022 et GCC.

Articles connexes