2010-02-10 8 views

Respuesta

18

std::pair proporciona constructores escritos previamente y operadores de comparación. Esto también les permite ser almacenados en contenedores como std :: map sin que usted tenga que escribir, por ejemplo, el constructor de copia o el orden débil estricto a través de operator < (como requiere std::map). Si no los escribe, no puede cometer un error (¿recuerda cuán estricto funciona el orden débil?) Así que es más confiable simplemente usar std::pair.

+1

No creo que std :: pair proporcione constructores u operadores para sus miembros. ¿En qué estás pensando exactamente? – Manuel

+1

@ Manuel, en realidad acabo de comprobar y, por supuesto, 'pair' proporciona un ctor predeterminado, y una copia de plantilla ctor. Tiene sentido: de esta forma, en cada caso, 'pair' permite llamarlo si & solo si los tipos subyacentes lo permiten. –

+1

Sí, pero el OP parecía estar implicando que std :: pair * mágicamente * generó esos miembros para los tipos subyacentes. Es extraño que esta respuesta sea la que fue aceptada. – Manuel

5

En términos de asignación de memoria y eficiencia, no hay diferencia, ya que eso es exactamente lo que es std::pair.

+0

Eso es lo que responde a lo que me preguntaba, de repente me di cuenta de que la eficiencia realmente depende de lo que harías, así que es demasiada información. Voy a aceptar la pregunta de AshleysBrain para seguir pensando ... –

+2

No hay problema, pero hubiera tenido más sentido preguntar sobre la comparación de la facilidad de uso si eso es lo que le interesa. Naveen y yo respondimos la pregunta como se dijo. (No se queja, solo dice ...) –

+0

Hmm, parece que cometí un error grave en mi comentario. "Esa es la respuesta que me preguntaba" debería haber sido. Le di a AshleysBrain la respuesta aceptada ya que él fue rápido y dio una buena respuesta, igual que tú. Fue difícil elegir, pero fui por el que se beneficiaría más. –

1

No hay diferencia en términos de asignación de memoria o eficiencia. De hecho, en la implementación de STL estoy usando el par se define como struct pair

+0

¿Qué implementación de STL estás usando? –

+0

Estoy usando el que viene con el compilador VC9. – Naveen

+1

Sí, esto se adhiere a la convención común de que si un tipo definido por el usuario expone miembros de datos públicos (como 'pair' does with' first' y 'second') entonces tiene que ser una' struct'. – Manuel

15

std::pair aparece con una serie de constructores y operadores.

A struct permiten campos con nombre (que no sean first y second) y está listo para ampliarse en cualquier momento.

Si es posible, prefiera un struct, puede implicar algunos gastos generales, pero es definitivamente más fácil para el mantenimiento.

+11

+1 para el comentario de mantenimiento. Trabajé con un grupo de ingenieros de NJ que intentaron hacer todo (y me refiero a todo) con el STL, y en lugar de crear clases/estructuras apropiadas cuando el diseño lo indicó, usaron un contenedor STL. El código estaba lleno de "if (route.first.second [* iter] .first) {...}". ¡Uf! –

+0

Buena idea, lo tendremos en cuenta para más adelante. –

Cuestiones relacionadas