Existe uma diferença entre um std::paire um std::tuplecom apenas dois membros? (Além do óbvio que std::pairrequer dois e apenas dois membros e tuplepode ter mais ou menos ...)
Respostas:
Existem algumas diferenças:
std::tuplenão é exigido pelo padrão para ser um layout padrão . Cada um std::pair<T, Y>é de layout padrão se ambos Te Ysão de layout padrão.
É um pouco mais fácil obter o conteúdo de a do pairque de a tuple. Você tem que usar uma chamada de função no tuplecaso, enquanto o paircaso é apenas um campo de membro.
Mas é isso aí.
std::mapusa std::pair<const Key,T>como value_typemesmo em C ++ 11. Onde exatamente as tuplas são usadas std::map?
std::map.
O std::tuplenome de um é mais longo (um caractere extra). Mais desses caracteres são digitados com a mão direita, portanto, mais fáceis para a maioria das pessoas digitar.
Dito isso, std::pairpode ter apenas dois valores - não zero, um, três ou mais. DOIS valores. Uma tupla, entretanto, quase não tem limitação semântica no número de valores. Um std::pair, portanto, é um tipo de tipo seguro mais preciso a ser usado se você realmente deseja especificar um par de valores.
std::tuple<> é seguro para tipos (como não poderia ser?) E não é semanticamente diferente de . 2pair
Esta é uma resposta muito tardia, mas observe que, por std::pairser definido com variáveis de membro, seu tamanho não pode ser otimizado usando a otimização de classe base vazia ( firste seconddeve ocupar endereços distintos, mesmo se uma ou ambas forem uma classe vazia). Isso é exacerbado por quaisquer requisitos de alinhamento second_type, portanto, no pior caso, o resultado std::pairserá basicamente o dobro do tamanho que precisa ser.
std::tuplesó permite acesso por meio de funções auxiliares, portanto, é possível derivar de qualquer tipo se um ou outro estiver vazio, economizando na sobrecarga. A implementação do GCC, pelo menos, definitivamente faz isso ... você pode vasculhar os cabeçalhos para verificar isso, mas também há isso como evidência.
[[no_unique_address]] deve remover std::paira desvantagem de.
Pelo que vale a pena, acho que a saída do GDB de std :: tuple é muito mais difícil de ler. Obviamente, se você precisar de mais de 2 valores, std :: pair não funcionará, mas eu considero isso um ponto a favor de structs.
std::get<0>(tupleName)em um getter; GetX()é muito mais fácil de ler e mais curto. Ele tem uma pequena desvantagem que se você se esqueça de torná-lo um constalguém método pode fazer algo estúpido assim: GetX() = 20;.
.firste.secondsejam úteis, eles não oferecem nenhuma ajuda se um terceiro (ou mais) membro (s) forem necessários para uma mudança de código. Percebi que tenho tendência a usarstd::getindependentemente em qualquer Getters, dessa forma, não preciso alterar tudo, apenas os tipos de dados e quaisquermake_pairchamadas paramake_tuplechamadas.