¿Cuál es la mejor manera de filtrar todos los elementos en una estructura de datos que no obedecen a un determinado predicado? es decir, un método similar a los métodos de "filtro" en lenguajes de programación funcionales.Método de filtro para estructuras de datos C++
Respuesta
STL tiene remove_if
y remove_copy_if
algoritmos.
Y recuerde que "eliminar" en STL en realidad no elimina nada, simplemente empuja los indeseables a la parte posterior del autobús. ** Te estoy mirando, Rosa Parks! **;) Todavía tienes que llamar a 'container.erase (returnedIter, container.end())'. –
Esto 'debería' funcionar para cada clase de contenedor que tenga iteradores. Usando un puntero para mostrar que el contenedor se cambiará pasando por la función.
UnaryFunction necesita un tipo de retorno bool. Aunque el uso de las funciones propias STL podría ser más inteligentes ...
template <class Container,
class UnaryFunction>
void filter(Container *container, UnaryFunction func)
{
typedef typename Container::iterator iter; // g++ complains w/o typename
for(iter elem(container->begin()); elem != container->end();)
elem = (func(&*elem)) ? (elem + 1)
: container->erase(elem);
}
Sería mejor usar una referencia en lugar de un puntero (es más claro que la intención es modificar, no adquirir la propiedad). Además, esto sería bastante caro para los vectores, ya que para cada elemento único se eliminan todos los elementos desde esa posición hasta el final del vector, y también para los deques como la eliminación del medio es una operación costosa por básicamente las mismas razones. El único contenedor secuencial para el que esto es efectivo son las listas. –
@Rodriguez - Bueno, el punto que traté de hacer con referencia fue que no se puede pasar por alto que está pasando en la matriz real con la declaración 'filter (& vec, someFunc)', mientras que'filter (vec, someFunc) 'podría engañar a algunos que no se molestan en mirar la declaración de la función. En segundo lugar, me doy cuenta de que este no es el código más oportuno para vectores o colas, pero el OP pidió específicamente una función de filtro que funcione en todas las estructuras de datos; esto hace justamente eso; podemos discutir sobre la eficiencia. Sin embargo, sus puntos son válidos y deben ser tomados en consideración por el OP. – IAE
Y porque usa '(elem + 1)', solo funciona para contenedores de acceso aleatorio. (En primer lugar, los contenedores asociativos requerirían un bucle de borrado manual con una lógica diferente). – visitor
Si está utilizando impulso puede usar la biblioteca boost.iterator, que tiene filter_iterator para su caso. Incluso si no lo haces, es bastante fácil escribir el tuyo.
- 1. C# estructuras de datos
- 2. Guardar estructuras de datos en C#
- 3. Estructuras de datos para bioinformática
- 4. Uso de macros en C para definir estructuras de datos
- 5. Estructuras de datos espaciales en C
- 6. Estructuras de datos funcionales en C++
- 7. estructuras de datos fundamentales en C#
- 8. Estructuras de datos persistentes en C++
- 9. C# preservar las estructuras de datos
- 10. Delphi estructuras de datos
- 11. Estructuras de datos pregunta
- 12. Estructuras de datos en Python
- 13. ¿Estructuras de datos espaciales para mover objetos?
- 14. Constructor para estructuras en C
- 15. Estructuras de datos en lisp
- 16. Erlang estructuras de datos persistentes
- 17. Estructuras de datos complejas Redis
- 18. Algoritmos y estructuras de datos
- 19. Estructuras de datos Trie - Java
- 20. matriz de estructuras en C#
- 21. ¿Cómo comparo dos estructuras de datos complejas?
- 22. ¿Qué son estructuras de datos en Objective-C?
- 23. ¿Pruebas de unidades de referencia para estructuras de datos comunes?
- 24. C# "Las estructuras de este = ...."
- 25. biblioteca de estructuras de datos de JavaScript
- 26. Matriz de estructuras en C
- 27. estructuras de datos cíclicos inmutables Generación de
- 28. Comparaciones de complejidad entre estructuras de datos
- 29. Principales estructuras de datos de JavaScript
- 30. Utilizando C++ Boost archivos mapeados de memoria para crear estructuras de datos de disco posterior
posible duplicado de ["filtro" función de orden superior en C++] (http://stackoverflow.com/questions/3635260/filter-higher-order-function-in-c) – missingfaktor