On connait tous les containers avec leurs iterators associés. Mais il n'y a pas de filtres applicables à ces iterators pour réduire leur portée à un sous-ensemble du container.
Prenons l'exemple d'un std::vector. Supposons qu'il soit trié, on peut alors faire un std::lower_bound dessus. On obtient en retour un iterator que l'on peut incrémenter, décrémenter, etc, mais c'est à nous de vérifier que l'iterator soit déréférençable et que son "contenu" soit valide en fonction de la clé passée en paramètre à std::lower_bound, et ainsi de suite pour les incrémentations successives que l'on ferait sur l'iterator.
Idéalement on devrait obtenir un sous ensemble du container initial filtré par la clé.
On pourrait avoir la même situation avec un std::vector non trié, une clé permettant de dire si un élément du container est valide ou non.
Au lieu d'une clé on pourrait utiliser comme filtre un autre vector, de booléens par exemple.
Un autre type de filtre sur un vector trié: ignorer les doublons.
En définitive, j'essaie de conceptualiser de manière générique la notion de filtre sur un container (à priori quelconque) afin de pouvoir l'utiliser aussi simplement que ceci:La fonction apply_filter() serait une fonction template qui renverrait un pseudo container contenant les éléments filtrés du container passé en paramètre. Et, bien sûr, il n'est pas question d'en faire une copie, la complexité de apply_filter() doit être O(1).std::container c;
filtered_c=apply_filter(c, filter);
for(iterator it=filtered_c.begin();it!=filtered_c.end();++it)
{
}
Si vous avez des idées, merci.
Partager