¿Hay alguna diferencia entre an std::pair
y an std::tuple
con solo dos miembros? (Además de lo obvio que std::pair
requiere dos y solo dos miembros y tuple
puede tener más o menos ...)
92
Hay algunas diferencias:
std::tuple
nunca puede ser por diseño estándar (al menos, no es requerido por el estándar). Cada std::pair<T, Y>
es de diseño estándar si ambos T
y Y
son de diseño estándar.
Es un poco más fácil obtener el contenido de pair
un tuple
. Debe usar una llamada de función en el tuple
caso, mientras que el pair
caso es solo un campo miembro.
Pero eso es todo.
.first
y.second
son útiles, no ofrecen ayuda si se requiere un tercer (o más) miembro (s) en un cambio de código. He notado que tiendo a usarstd::get
independientemente en cualquier Getter de esa manera, no necesito cambiar todo, solo los tipos de datos y lasmake_pair
llamadas a lasmake_tuple
llamadas.std::map
usastd::pair<const Key,T>
comovalue_type
par en C ++ 11. ¿Dónde se usan exactamente las tuplasstd::map
?std::map
.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 la optimización de clase base vacía (first
ysecond
debe ocupar direcciones distintas, incluso si una o ambas son clases vacías). Esto se ve agravado por los requisitos de alineación quesecond_type
tenga, por lo que, en el peor de los casos, el resultadostd::pair
será básicamente el doble del tamaño que necesita.std::tuple
solo permite el acceso a través de funciones auxiliares, por lo que es posible que se derive de cualquier tipo si uno u otro está vacío, ahorrando en la sobrecarga. La implementación de GCC, al menos, definitivamente hace esto ... puede revisar los encabezados para verificar esto, pero también hay esto como evidencia.fuente
[[no_unique_address]]
debería eliminarstd::pair
la desventaja.El
std::tuple
nombre de An es más largo (un carácter adicional). 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, casi no tiene limitación semántica en el número de valores. Anstd::pair
, por lo tanto, es un tipo seguro de tipo más preciso para usar si realmente desea especificar un par de valores.fuente
std::tuple<>
es de tipo seguro (¿cómo no podría serlo?), Y no es semánticamente diferente a .2
pair
Tenga en cuenta que con C ++ 17, se puede usar la misma interfaz para leer datos tanto de pares como de tuplas con dos elementos.
auto [a, b] = FunctionToReturnPairOrTuple();
No es necesario usar
get<>
:)fuente
Por lo que vale, encuentro que la salida GDB de std :: tuple es mucho más difícil de leer. Obviamente, si necesita más de 2 valores, std :: pair no funcionará, pero considero que esto es un punto a favor de las estructuras.
fuente
std::get<0>(tupleName)
en un captador;GetX()
es mucho más fácil de leer y más corto. Tiene una pequeña desventaja de que si se olvida de que sea unconst
método que alguien puede hacer algo estúpido como esto:GetX() = 20;
.