web-dev-qa-db-fra.com

Différence entre std :: pair et std :: Tuple avec seulement deux membres?

Y a-t-il une différence entre un std::pair Et un std::Tuple avec seulement deux membres? (Outre l'évidence que std::pair nécessite deux et seulement deux membres et Tuple peut avoir plus ou moins ...)

72
Casey

Il y a quelques différences:

  1. std::Tuple ne peut jamais être par mise en page standard (au moins, il n'est pas requis pour être par la norme). Chaque std::pair<T, Y> est de mise en page standard si T et Y sont de mise en page standard.

  2. Il est un peu plus facile d'obtenir le contenu d'un pair que d'un Tuple. Vous devez utiliser un appel de fonction dans le cas Tuple, tandis que le cas pair n'est qu'un champ membre.

Mais c'est à peu près tout.

73
Nicol Bolas

C'est une réponse très tardive, mais notez que, parce que std::pair est défini avec des variables membres, sa taille ne peut pas être optimisée à l'aide de optimisation de classe de base vide (first et second doivent occuper des adresses distinctes, même si l'une ou les deux sont une classe vide). Ceci est exacerbé par toutes les exigences d'alignement second_type a, donc dans le pire des cas, le résultat std::pair sera pratiquement le double de sa taille.

std::Tuple n'autorise l'accès que par le biais des fonctions d'assistance, il est donc possible qu'il dérive de l'un ou l'autre type si l'un ou l'autre est vide, ce qui permet d'économiser sur la surcharge. L'implémentation de GCC, au moins, le fait certainement ... vous pouvez fouiller dans les en-têtes pour le vérifier, mais il y a aussi this comme preuve.

26
Stephen Lin

Le nom d'un std::Tuple Est plus long (un caractère supplémentaire). Un plus grand nombre de ces caractères sont saisis avec la main droite, donc plus facile à saisir pour la plupart des gens.

Cela dit, std::pair Ne peut avoir que deux valeurs - pas zéro, une, trois ou plus. DEUX valeurs. Un tuple, cependant, n'a presque aucune limitation sémantique sur le nombre de valeurs. Un std::pair Est donc un type sûr de type plus précis à utiliser si vous voulez réellement spécifier une paire de valeurs.

22
Arafangion

Pour ce que ça vaut, je trouve que la sortie GDB de std :: Tuple est beaucoup plus difficile à lire. Évidemment, si vous avez besoin de plus de 2 valeurs, std :: pair ne fonctionnera pas, mais je considère cela comme un point en faveur des structures.

3
tgoodhart

Notez qu'avec C++ 17, on peut utiliser la même interface pour lire les données de la paire et du tuple avec deux éléments.

auto [a, b] = FunctionToReturnPairOrTuple();

Pas besoin d'utiliser get<> :)

2
bhardwajs