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?
Respuesta
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.
+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
El usuario sabe * y puede obtener en tiempo constante *. –
@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
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?
¿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
@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
@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 –
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.
- 1. ObservableCollection <> vs. List <>
- 2. inicializar mapa <cadena, vector <string>>
- 3. Color de referencia en <item> -Tag, en el interior <layer-list>
- 4. return Queryable <T> o List <T> en un Repository <T>
- 5. List <> propia comparador
- 6. ¿List <>. IndexOf se compara por referencia o valor?
- 7. ¿Debo usar boost :: ptr_vector <T> o vector <boost :: shared_ptr <T>>?
- 8. Queue <T> vs List <T>
- 9. public List <(Of <(<'T>)>)> .. :: .. Enumerator?
- 10. ¿Qué es <span></span> elemento?
- 11. segfault en el vector <struct>
- 12. ¿Por qué IList <>. Reverse() no funciona como List <>(). Reversa
- 13. Javascript y `<> ...</>` etiquetas
- 14. Alternativa al vector <bool>
- 15. no puede convertir List <KeyValuePair <...,...>> IEnumerable a <object>?
- 16. Lista <? extiende Base> VS List <Base>
- 17. ¿Por qué Enumerable.ToLookup <>() devuelve un ILookup <,> y no una búsqueda <,>?
- 18. Convertir la lista <MyObject> al Diccionario <obj.string, Lista <obj.ID>>
- 19. moldeada vector <T> al vector <const T>
- 20. ¿Por qué IList <> tiene menos funciones que List <>?
- 21. Obtener una referencia al elemento padre <script>
- 22. C# Casting a List <ObjBase> como List <Obj>
- 23. Casting List <> de la clase derivada a List <> de la clase base
- 24. ¿Por qué List <>. OrderBy LINQ es más rápido que IComparable + List <>. ¿Ordenar en modo Debug?
- 25. C# List <> Ordena por x then y
- 26. SortedList <>, SortedDictionary <> y Dictionary <>
- 27. Diccionario <StudentType, List <Student>> to IDictionary <StudentType, IList <Student>>?
- 28. ¿Por qué Entity Framework devuelve null List <> en lugar de los vacíos?
- 29. jsRender loop a List <string>
- 30. qué colección de C# usar en lugar de List <KeyValuePair <string, double >>?
'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;') –
@AaronMcDaid: Gracias por señalar eso, reformulé la pregunta. – Samaursa