Rendimiento :
Depende.
En su caso particular, no habrá diferencia de rendimiento porque los dos se presentarán de manera similar en la memoria.
En un caso muy específico (si estaba utilizando una estructura vacía como uno de los miembros de datos), std::pair<>
podría utilizar la Optimización de base vacía (EBO) y tener un tamaño inferior al equivalente de la estructura. Y un tamaño más bajo generalmente significa un mayor rendimiento:
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";
}
Impresiones: 32, 32, 40, 40 en ideona .
Nota: No conozco ninguna implementación que realmente use el truco EBO para pares regulares, sin embargo, generalmente se usa para tuplas.
Legibilidad :
Además de las microoptimizaciones, una estructura con nombre es más ergonómica.
Quiero decir, map[k].first
no es tan malo mientras get<0>(map[k])
apenas es inteligible. Contrastar conmap[k].name
que inmediatamente indica de qué estamos leyendo.
Es aún más importante cuando los tipos son convertibles entre sí, ya que intercambiarlos sin darse cuenta se convierte en una verdadera preocupación.
Es posible que también desee leer sobre Mecanografía estructural vs nominal. Ente
es un tipo específico que sólo puede ser operado por las cosas que esperan Ente
, cualquier cosa que pueda operar sobre std::pair<std::string, bool>
puede operar sobre ellos ... incluso cuando el std::string
o bool
no contiene lo que esperan, porque std::pair
no tiene la semántica asociados a ella.
Mantenimiento :
En términos de mantenimiento, pair
es lo peor. No puedes agregar un campo.
tuple
ferias mejor en ese sentido, siempre y cuando agregue el nuevo campo todos los campos existentes todavía se accede por el mismo índice. Lo cual es tan inescrutable como antes, pero al menos no necesita ir a actualizarlos.
struct
Es el claro ganador. Puede agregar campos donde lo desee.
En conclusión:
pair
es lo peor de ambos mundos
tuple
puede tener una ligera ventaja en un caso muy específico (tipo vacío),
- uso
struct
.
Nota: si usa getters, puede usar el truco de la base vacía usted mismo sin que los clientes tengan que saberlo como en struct Thing: Empty { std::string name; }
; Es por eso que Encapsulación es el siguiente tema con el que debe preocuparse.
std::pair
es una estructura.