2009-04-25 12 views
11

Me pasan un iterador y tengo que pasarlo a otra función, pero filtrado para que se omitan ciertos elementos (es un rango de punteros, y quiero filtrar los punteros NULL).boost :: filter_iterator - ¿cómo podría hacer eso con el STL?

Busqué en la red para "stl filter iterator" para ver cómo hacerlo, y apareció boost::filter_iterator.

Eso se ve bien y podría usarlo, pero ¿podría hacerlo con el viejo STL también? Sin copiar los elementos en un nuevo contenedor, por supuesto.

Supongo que tendré que crear otra clase de iterador que proporcione las funciones necesarias begin(), end() etc. ¿Y el filtro? Entonces, ¿tendré exactamente que volver a implementar el boostiterator_filter ...?

Respuesta

8

Tiene razón; esencialmente estarías recreando el iterador del filtro tú mismo. Mi consejo sería usar filter_iterator de Boost. Boost tiene un estado especial como la biblioteca externa más utilizada de C++; muchos miembros del comité de C++ han ayudado a escribir bibliotecas para impulsar. Su ubicuidad esencialmente lo hace casi como lo es; no hay realmente ninguna razón para reinventar la rueda aquí.

+3

Estoy un poco en desacuerdo: el impulso puede ser engorroso de instalar y, a veces, no desea esa dependencia adicional. Creo que la razón * real * por la que uno no volvería a escribir 'filter_iterator' es que, de hecho, es bastante difícil (y muy engorroso) escribir correctamente. –

4

Estoy de acuerdo con rlbond. No reinvente la rueda y use Boost :: filter_iterator. Si no desea tener todas las bibliotecas de impulso en su proyecto, puede considerar usar boost.bcp para extraer exactamente las que necesita.

Cuestiones relacionadas