Desempenho :
Depende.
No seu caso particular, não haverá diferença de desempenho, pois os dois serão dispostos da mesma forma na memória.
Em um caso muito específico (se você estivesse usando uma estrutura vazia como um dos membros dos dados), o std::pair<>
potencial poderia fazer uso da otimização da base vazia (EBO) e ter um tamanho menor que o equivalente à estrutura. E tamanho menor geralmente significa maior desempenho:
struct Empty {};
struct Thing { std::string name; Empty e; };
int main() {
std::cout << sizeof(std::string) << "\n";
std::cout << sizeof(std::tuple<std::string, Empty>) << "\n";
std::cout << sizeof(std::pair<std::string, Empty>) << "\n";
std::cout << sizeof(Thing) << "\n";
}
Impressões: 32, 32, 40, 40 em ideone .
Nota: Não conheço nenhuma implementação que realmente use o truque EBO para pares regulares, no entanto, geralmente é usado para tuplas.
Legibilidade :
Além das micro-otimizações, no entanto, uma estrutura nomeada é mais ergonômica.
Quero dizer, map[k].first
não é tão ruim assim tão get<0>(map[k])
pouco inteligível. Contraste com o map[k].name
qual indica imediatamente o que estamos lendo.
É ainda mais importante quando os tipos são conversíveis entre si, pois trocá-los inadvertidamente se torna uma preocupação real.
Você também pode querer ler sobre Estrutural versus Tipagem Nominal. Ente
é um tipo específico que só pode ser operado por coisas que esperamos Ente
, qualquer coisa que possa operar std::pair<std::string, bool>
pode operar com elas ... mesmo quando o contém std::string
ou bool
não o que eles esperam, porque std::pair
não possui semântica associada a ele.
Manutenção :
Em termos de manutenção, pair
é o pior. Você não pode adicionar um campo.
tuple
feiras melhor nesse sentido, desde que você acrescente o novo campo, todos os campos existentes ainda serão acessados pelo mesmo índice. O que é tão inescrutável quanto antes, mas pelo menos você não precisa atualizá-los.
struct
é o vencedor claro. Você pode adicionar campos onde quiser.
Em conclusão:
pair
é o pior dos dois mundos,
tuple
pode ter uma ligeira aresta em um caso muito específico (tipo vazio),
- use
struct
.
Nota: se você usa getters, pode usar o truque de base vazia sem que os clientes tenham que saber sobre isso como em struct Thing: Empty { std::string name; }
; é por isso que o encapsulamento é o próximo tópico com o qual você deve se preocupar.
std::pair
é uma estrutura.