2012-01-23 14 views
13

Me doy cuenta de que puedo obtener el iterador de referencia llamando al back(), pero ¿por qué no devolverlo también con push_back()? ¿Es por motivos de rendimiento? ¿O se debe a una excepción de seguridad (similar al por qué pop_back() no devuelve el valor reventado)? En cualquier caso, por favor explique.¿Por qué los push_back en los contenedores vector <> y list <> devuelven la referencia al elemento insertado?

+0

'volver' no le da un iterador. Le da una referencia al último artículo. A continuación, puede tomar el 'y' de ese elemento, pero esto no es un iterador. Creo que la única forma de obtener un iterador para el último elemento de una lista es usar 'rbegin()' o 'end() - 1'. (Tal vez eso tiene que ser 'auto x = l.end(); --x;') –

+0

@AaronMcDaid: Gracias por señalar eso, reformulé la pregunta. – Samaursa

Respuesta

16

Diversas funciones insert devuelven un iterador por una razón muy simple: la persona que llama no necesariamente sabe cómo obtener un iterador para ese elemento. map::insert y set::insert devuelven uno porque, de lo contrario, la persona que llama debería buscar el elemento.

Cuando hace un vector::push_back, sabe donde está el elemento insertado. Es --vector.end(). No tienes que buscarlo; es siempre esa ubicación. Puedes obtenerlo en tiempo constante, y un tiempo constante bastante rápido en eso.

Así que realmente no tiene sentido devolver algo que el usuario ya sabe.

+0

+1. Este argumento tiene sentido. 'push_back' empuja el elemento hacia atrás, por lo que la persona que llama sabe prácticamente dónde va el elemento y cuál será el iterador. – Nawaz

+2

El usuario sabe * y puede obtener en tiempo constante *. –

+0

@NicolBolas Usted tiene un punto. Acabo de suponer que al OP le gustaría recuperar un iterador para obtener una referencia al objeto insertado. No veo ningún otro caso de uso real de lo contrario. – pmr

1

No sé si hay una razón oficial, pero la más inmediata que se me viene a la mente es el rendimiento. Si observa la mayoría de los usos de push_back y push_front, no se utiliza el valor de retorno. Donde se empuja un elemento no es tan importante como que se empuja.

¿Por qué devolver un valor no gratuito que casi nunca se utiliza?

+3

¿No debería el compilador tirarlo en el momento de la compilación, ya que puede ver claramente que el iterador devuelto no se está utilizando? – Samaursa

+0

@Samaursa En general, si un método dado produce un valor de retorno, el compilador no tiene la libertad de optimizar la creación de ese valor. Podría tener efectos secundarios que dependen de la persona que llama/persona que llama. Sin duda puede descartar el resultado, pero eso no elimina la sobrecarga de la creación – JaredPar

+1

@Samaursa El compilador no puede descartarlo a menos que la llamada esté en línea, en cuyo caso podría hacerlo si puede demostrar que la construcción de la declaración el valor no tiene efectos secundarios –

0

La razón es que vector proporciona un método insert que sí devuelve un iterador a la posición insertada. El estándar es consistente en que push_back no devuelve un valor, pero algunas formas de insert, cuando estén disponibles y sean apropiadas.

Cuestiones relacionadas