2009-04-25 8 views
11

On me passe un Iterator et je dois le passer à une autre fonction - mais filtré pour que certains éléments soient ignorés (c'est une plage de pointeurs, et je veux filtrer les pointeurs NULL).boost :: filter_iterator - comment le ferais-je avec le STL?

J'ai recherché sur Google "stl filter itérateur" pour voir comment faire cela, et boost::filter_iterator est apparu.

Ça a l'air sympa et je pourrais l'utiliser, mais est-ce que je pourrais le faire avec le bon vieux STL aussi? Sans copier les éléments dans un nouveau conteneur, bien sûr.

Je suppose que je devrais créer une autre classe d'itérateur qui fournit les fonctions begin(), end() etc nécessaires et fait le filtrage? Donc, je devrais exactement réimplémenter le boostiterator_filter ...?

Répondre

8

Vous avez raison; vous recréerez essentiellement l'itérateur de filtre vous-même. Mon conseil serait d'utiliser filter_iterator de Boost. Boost a un statut spécial en tant que bibliothèque externe la plus utilisée de C++; de nombreux membres du comité C++ ont contribué à l'écriture de bibliothèques. Son omniprésence le rend essentiellement presque tel qu'il est; il n'y a vraiment aucune raison de réinventer la roue ici.

+3

Je ne suis pas du tout d'accord: la mise à jour peut être fastidieuse à installer, et parfois vous ne voulez pas cette dépendance supplémentaire. Je pense que la raison * réelle * qu'on ne réécrirait pas 'filter_iterator' est qu'il est en fait assez difficile (et très lourd) d'écrire correctement. –

4

Je suis d'accord avec rlbond. Ne réinventez pas la roue et utilisez Boost :: filter_iterator. Si vous ne voulez pas avoir toutes les bibliothèques de boost dans votre projet, vous pouvez envisager d'utiliser boost.bcp pour extraire exactement celles dont vous avez besoin.

Questions connexes