Quel est le meilleur moyen de filtrer tous les éléments d'une structure de données qui n'obéissent pas à un certain prédicat? c'est-à-dire une méthode similaire aux méthodes "filtre" dans les langages de programmation fonctionnels.Méthode de filtrage pour les structures de données C++
Répondre
Les algorithmes du langage STL sont remove_if
et remove_copy_if
.
Et rappelez-vous que "supprimer" dans STL ne supprime rien, pousse juste les indésirables à l'arrière du bus. ** Je vous regarde, Rosa Parks! **;) Vous devez toujours appeler 'container.erase (returnIter, container.end())'. –
Ceci devrait fonctionner pour toutes les classes de conteneurs qui ont des itérateurs. En utilisant un pointeur pour montrer que le conteneur sera modifié en passant par la fonction.
UnaryFunction nécessite un type de retour bool. Bien que l'utilisation des fonctions appropriées STL pourrait être plus intelligent ...
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);
}
Il serait préférable d'utiliser une référence au lieu d'un pointeur (il est plus clair que l'intention est de modifier, pas d'acquérir la propriété). De plus, cela serait assez coûteux pour les vecteurs, puisque pour chaque élément, tous les éléments de cette position sont supprimés jusqu'à la fin du vecteur, et pour les deques, la suppression du milieu est une opération coûteuse pour les mêmes raisons. Le seul conteneur séquentiel pour lequel ceci est efficace sont des listes. –
@Rodriguez - Eh bien, le point que j'essayais de faire en référence était que vous ne pouvez pas ignorer que vous passez dans le tableau réel avec la déclaration 'filter (& vec, someFunc)' alors que'filter (vec, someFunc) 'pourrait induire en erreur certains qui ne prennent pas la peine de regarder la déclaration de fonction. Deuxièmement, je réalise que ce n'est pas le code le plus opportun pour les vecteurs ou les files d'attente, mais le PO a spécifiquement demandé une fonction de filtre qui fonctionne sur toutes les structures de données - c'est exactement ce que nous faisons; on peut discuter de l'efficacité. Cependant, vos points sont valides et doivent être pris en compte par le PO. – IAE
Et parce qu'il utilise '(elem + 1)', il ne fonctionne que pour les conteneurs d'accès aléatoire. (Les conteneurs associatifs nécessiteraient une boucle d'effacement manuelle avec une logique différente en premier lieu.) – visitor
Si vous utilisez coup de pouce, vous pouvez utiliser la bibliothèque boost.iterator, qui a filter_iterator pour votre cas. Même si vous ne le faites pas, il est assez facile d'écrire le vôtre.
- 1. Structures de données C#
- 2. C#: Filtrage des données de la table de données à l'aide de la méthode select
- 3. fondamentales Structures de données en C#
- 4. Structures de données - analyse asymptotique (C++)
- 5. Structures de données multidimensionnelles en C#
- 6. Structures de données persistantes dans C++
- 7. Animations pour les algorithmes et les structures de données?
- 8. Quelles sont les structures de données dans Objective-C?
- 9. comment rendre les structures de données persistantes en C++?
- 10. structures de données Javascript
- 11. Quelles sont les structures de données d'information?
- 12. Organiser les structures de données MySQL
- 13. structures de répertoires C++
- 14. structures de données allouées statiques
- 15. Filtrage des données de l'accéléromètre
- 16. C/C++ d'optimiser les structures de données, tableau de tableaux ou matrices juste
- 17. Structures de données Python, dictionnaire?
- 18. Rangement de structures de C#
- 19. Structures C++, membres de données publiques et héritage
- 20. Définition des structures de données et des algorithmes C#
- 21. Synchroniser deux structures séparées avec les mêmes données de base
- 22. C++ nouvel héritage d'opérateur et structures de données en ligne
- 23. Quels sont les équivalents C# de ces structures C++
- 24. Structures de données C# Question (Quelle collection utiliser?)
- 25. Quelles autres structures de données sont disponibles dans C++ STL?
- 26. Javascript: Où sont les structures de données de haut niveau?
- 27. méthodes internes et structures de données.
- 28. filtrage de chaînes sur C++
- 29. Utilisation de structures de données statiques pour DMA
- 30. Sérialisation de structures complexes en C++
duplication possible de ["filtre" fonction d'ordre supérieur en C++] (http://stackoverflow.com/questions/3635260/filter-higher-order-function-in-c) – missingfaktor