Prestazioni :
Dipende.
Nel tuo caso particolare non ci saranno differenze di prestazioni perché i due saranno similmente disposti in memoria.
In un caso molto specifico (se si utilizzava una struttura vuota come uno dei membri dei dati), si std::pair<>
potrebbe potenzialmente utilizzare l'ottimizzazione della base vuota (EBO) e avere una dimensione inferiore rispetto all'equivalente della struttura. E dimensioni inferiori generalmente significano prestazioni più elevate:
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";
}
Stampe: 32, 32, 40, 40 su ideone .
Nota: non sono a conoscenza di alcuna implementazione che utilizza effettivamente il trucco EBO per le coppie regolari, tuttavia viene generalmente utilizzato per le tuple.
Leggibilità :
A parte le micro-ottimizzazioni, tuttavia, una struttura denominata è più ergonomica.
Voglio dire, map[k].first
non è poi così male mentre get<0>(map[k])
è appena comprensibile. Contrasto con il map[k].name
quale indica immediatamente da cosa stiamo leggendo.
È tanto più importante quando i tipi sono convertibili l'uno nell'altro, poiché scambiarli inavvertitamente diventa una vera preoccupazione.
Potresti anche leggere informazioni sulla digitazione strutturale e nominale. Ente
è un tipo specifico che può essere operato solo dalle cose che si aspettano Ente
, tutto ciò che può operare std::pair<std::string, bool>
può operare su di esse ... anche quando la std::string
o bool
non contiene ciò che si aspettano, perché std::pair
non ha alcuna semantica associata.
Manutenzione :
In termini di manutenzione, pair
è il peggiore. Non è possibile aggiungere un campo.
tuple
fiere migliori a tale riguardo, fintanto che si aggiunge il nuovo campo a tutti i campi esistenti si accede ancora dallo stesso indice. Il che è imperscrutabile come prima ma almeno non è necessario andare ad aggiornarli.
struct
è il chiaro vincitore. Puoi aggiungere campi ovunque tu ne abbia voglia.
In conclusione:
pair
è il peggiore di entrambi i mondi,
tuple
potrebbe avere un leggero vantaggio in un caso molto specifico (tipo vuoto),
- usare
struct
.
Nota: se usi getter, puoi usare tu stesso il trucco base vuoto senza che i client debbano saperlo come in struct Thing: Empty { std::string name; }
; ecco perché l' incapsulamento è il prossimo argomento di cui dovresti occuparti.
std::pair
è una struttura.