¿Es posible eliminar un elemento de un std::list
si solo tiene el iterador que apunta al elemento que desea eliminar? Tengo una gran cantidad de funciones que toman iteradores para enumerar elementos, y sería un gran inconveniente tener que pasar el list
propio a cada uno de ellos.Eliminar un elemento de una lista con solo su iterador
Respuesta
Editar:
Usted no puede con un único repetidor.
Si tiene los iteradores de inicio/final, puede usar el algoritmo std::remove
para mover todos los elementos que desea borrar hasta el final y eliminarlos en un momento posterior.
Si no lo hace, o lo anterior no es factible con su diseño actual, le recomiendo que modifique sus funciones para tomar un std::pair<std::list<T>, std::list<T>::iterator>
o algo así.
Pero también requiere la lista. – Dani
La función 'std :: remove()' no * elimina elementos del contenedor *, porque simplemente no puede. Echa un vistazo a [borrar idioma] (http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Erase-Remove). –
@ André - Eso es lo que dije.Úselo para moverlos hasta el final _y elimínelos en un momento posterior_ – Node
No, esto no es posible. Como su nombre lo sugiere, el trabajo de un iterador es iterar sobre los elementos de una secuencia. Consulte SGI page on iterators para obtener un resumen del diseño de iteradores en la biblioteca estándar de C++.
Como 'list' es una lista doblemente enlazada, ¿no podría escribir una función para manipular los punteros' next' y 'previous' para que elimine el elemento? ¿O eso sería realmente malo? ¿O es solo que los miembros son privados? –
@Seth: sí, esto es técnicamente posible. Por ejemplo, en Java, los iteradores tienen un [método eliminar] (http://download.oracle.com/javase/1.4.2/docs/api/java/util/Iterator.html#remove()). Sin embargo, esto no es parte del diseño del iterador de C++. Supongo que el comité estándar prefirió la uniformidad con otros contenedores. –
@Seth: esto podría hacerse para una versión específica de la biblioteca de un proveedor específico. Sin embargo, significa un montón de código no estándar (y definitivamente no portátil). Además, los miembros son probablemente privados. –
No, no puedes. Los iteradores son objetos livianos modelados después de punteros y no llevan una referencia al contenedor al que se refieren. (Aunque algunas implementaciones lo hacen internamente en modo Depuración.)
Del mismo modo que no puede "eliminar" un objeto de una matriz cuando todo lo que tiene es un puntero en la matriz, no puede quitar un objeto de un contenedor sin tener también acceso al contenedor.
Puede hacerlo manualmente. iterador expone _M_node
como el nodo actual. usted puede hacer algo como:
itr._M_node->_M_prev->_M_next = itr._M_node._M_next;
Este es solo el caso de un iterador específico en un contenedor específico en versiones específicas de una implementación específica, es un detalle de implementación e incluso se puede desactivar utilizando el token de preprocesador correcto. Además, podría estropear las partes internas del contenedor, lo que necesitaría saber para poder hacerlo. – sbi
No dije que estaba limpio. tu advertencia es correcta aunque – Dani
Sin mencionar que no actualizaste el puntero '_M_prev' de' _M_next' (porque es una lista dlinked). Eso es algo en lo que estaba pensando, pero este código también debe funcionar con diferentes versiones/compiladores. –
No se puede hacer eso con la biblioteca estándar, pero se puede utilizar la lista intrusiva de Boost http://www.boost.org/doc/libs/1_37_0/doc/html/boost/intrusive/list.html que tiene una interfaz de este tipo.
Mientras que otros han mencionado que no puede hacerlo, creo que puedo ofrecerle por qué.
Creo que el motivo técnico específico (más que el motivo del diseño) es que las listas realizan algunas tareas de mantenimiento, como el seguimiento del tamaño, por ejemplo, que requieren que se pasen ciertas acciones para permitir el mantenimiento.
Es por esta razón que cualquier ataque que pueda ofrecerse probablemente fallará.
Eso es una buena idea, aunque parece que podría hacer que los iteradores le digan a su lista de padres que se están eliminando o algo así. –
- 1. Seleccionar un solo elemento de una lista
- 2. Recorrer una lista con un iterador?
- 3. emacs lisp: ¿Cómo eliminar/eliminar un elemento de una lista?
- 4. Iterador de segundo al último elemento de una lista
- 5. ¿Cómo puedo eliminar un elemento de una lista?
- 6. asp.net: ¿Cómo puedo eliminar un elemento de una lista desplegable?
- 7. Lista vs Lista iterador
- 8. Eliminar elemento de la lista con el predicado
- 9. Elisp: Cómo eliminar un elemento de una lista de asociación con la cadena de clave
- 10. ¿Cómo eliminar un artículo que se aleja de su lista?
- 11. Backbone.js: Eliminar un elemento de una colección
- 12. Eliminar solo el primer elemento de una selección de jquery
- 13. F # insertar/eliminar elemento de la lista
- 14. lo bien eliminar elemento de la lista
- 15. Eliminar un elemento de la lista que coincide con una subcadena - Python
- 16. C# - ¿Cómo eliminar un elemento de la lista?
- 17. Eliminar un elemento de una colección (NHibernate)
- 18. ¿Cómo eliminar el primer y último elemento de una lista?
- 19. Tamaño de estructura con un solo elemento
- 20. Extraer un solo elemento de la lista en F #
- 21. eliminar elemento de la matriz en función de su valor?
- 22. iterador de lista no aumentable
- 23. Eliminar un solo carácter de una cadena?
- 24. Algoritmo para eliminar un elemento en una sola lista vinculada con O (1) complejidad
- 25. Eliminar un elemento de una matriz (Java)
- 26. ¿Cómo eliminar el borde solo desde un lado del elemento?
- 27. java lista de un elemento
- 28. ¿readlines() devuelve una lista o un iterador en Python 3?
- 29. ¿Cómo eliminar un elemento lentamente con jQuery?
- 30. scala Eliminar (en su lugar) todos los elementos de un ListBuffer que cumplan con una condición
Tenga en cuenta que usar un iterador de esta manera va en contra de su uso como patrón de diseño, pero eso no quiere decir que no sea lo correcto en muchas situaciones (por ejemplo, mirar los elementos de un conjunto) – Jeremy
http: // stackoverflow.com/questions/596162/can-you-remove-elements-from-a-stdlist-while-iterating-through-it – nielsj
@Jeremy: en realidad, no es el uso del iterador como un patrón de diseño. Sin embargo, tiene una semántica pobre con respecto a la invalidación del iterador. En muchos contenedores, la eliminación de un elemento invalida todos los iteradores, incluido el que está utilizando actualmente para iterar sobre los elementos. –