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...)
4 answers
Hay algunas diferencias:
std::tuple
nunca puede ser por standard-layout (al menos, no es requerido para ser por el estándar). Cadastd::pair<T, Y>
es standard-layout si ambosT
yY
son standard-layout.Es un poco más fácil obtener el contenido de un
pair
que de untuple
. Tienes que usar una llamada a función en el casotuple
, mientras que el casopair
es solo un campo miembro.
Pero eso es todo.
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.
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.
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.
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