Diferencia entre std:: pair y std::tuple con solo dos miembros?


¿Hay una diferencia entre un std::pair y un std::tuple con solo dos miembros? (Además de lo obvio que std::pair requiere dos y solo dos miembros y tuple puede tener menos...)

Author: w.b, 2011-07-14

4 answers

Hay algunas diferencias:

  1. std::tuple nunca puede ser por standard-layout (al menos, no es requerido para ser por el estándar). Cada std::pair<T, Y> es standard-layout si ambos T y Y son standard-layout.

  2. Es un poco más fácil obtener el contenido de un pair que de un tuple. Tienes que usar una llamada a función en el caso tuple, mientras que el caso pair es solo un campo miembro.

Pero eso es todo.

 58
Author: Nicol Bolas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-01 15:58:35

Esta es una respuesta muy tardía, pero tenga en cuenta que, debido a que std::pair se define con variables miembro, su tamaño no se puede optimizar utilizando optimización de clase base vacía (first y second debe ocupar direcciones distintas, incluso si una o ambas son una clase vacía). Esto se ve exacerbado por cualquier requisito de alineación que tenga second_type, por lo que en el peor de los casos el std::pair resultante será básicamente el doble del tamaño que necesita ser.

std::tuple solo permite el acceso a través de funciones auxiliares, por lo que es posible para derivar de cualquier tipo si uno u otro está vacío, ahorrando en la sobrecarga. La implementación del CCG, por lo menos, definitivamente hace esto...puedes revisar los encabezados para verificar esto, pero también hay esto como evidencia.

 21
Author: Stephen Lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-26 05:53:12

El nombre de un std::tuple es más largo (un carácter extra). Más de esos caracteres se escriben con la mano derecha, por lo que es más fácil para la mayoría de las personas escribir.

Dicho esto, std::pair solo puede tener dos valores - no cero, uno, tres o más. DOS valores. Una tupla, sin embargo, no tiene casi ninguna limitación semántica en el número de valores. Un std::pair, por lo tanto, es un tipo más preciso y seguro para usar si realmente desea especificar un par de valores.

 17
Author: Arafangion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-21 01:46:32

Por si sirve de algo, encuentro que la salida GDB de std::tuple es mucho más difícil de leer. Obviamente, si necesita más de 2 valores, entonces std:: pair no funcionará, pero considero esto un punto a favor de las estructuras.

 3
Author: tgoodhart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-26 15:45:45