2010-05-19 20 views
8

Estoy tratando de obtener un simple borrar cada puntero en mi función vector/list/... escrita con una función lambda ultra cool.lambda + for_each + eliminar en contenedores STL

template <typename T> 
void delete_clear(T const& cont) 
{ 
    for_each(T.begin(), T.end(), [](???){ ???->delete() }); 
} 

No tengo ni idea de qué rellenar para los ??? 's. ¡Cualquier ayuda es muy apreciada!

ACTUALIZACIÓN: Esto es lo que debe ser similar:

template <typename Container> 
void delete_clear(Container &c) 
{ 
    for_each(c.begin(), c.end(), [](typename Container::value_type x){ delete x; }); 
    c.clear(); 
} 
+1

Tendrá que hacer 'cont' no constante con el fin de llamar' clear() 'en él. Y llámelo en 'cont', no en T ;-p –

+0

Si necesita contenedores de punteros, eche un vistazo a la biblioteca Boost Pointer Container (http://www.boost.org/doc/libs/1_43_0/libs/ptr_container/ doc/ptr_container.html). – Philipp

+0

No tome un contenedor por referencia. Usa iteradores. – pmr

Respuesta

9

dos cuestiones: la propia sintaxis lambda, y cómo obtener el tipo de valor de un contenedor:

llamar a la función mydelete() en cada puntero (suponiendo que haya definido una función miembro de mydelete()):

for_each(c.begin(), c.end(), [](typename T::value_type x){ x->mydelete(); }); 

Para eliminarlas con el operador delete:

for_each(c.begin(), c.end(), [](typename T::value_type x){ delete x; }); 

Además, lambda no es necesariamente la mejor característica nueva en C++ 11 para un problema dado:

for(auto x : c) { delete x; } 

me gustaría tener en cuenta que es un poco fiable para tomar una const referencia a un contenedor y eliminar todo lo que contiene, aunque la lengua no le impida por lo que son los indicadores ¿Estás seguro de que es una operación "constante", sin embargo, dentro del significado y el uso de tu contenedor?

Si está escribiendo este código, tal vez se beneficie de Boost pointer containers, o contenedores de shared_ptr.

+0

Dos buenas respuestas, pero esta me gusta mejor (operador <-> función de miembro eliminar + una línea). Gracias – rubenvb

+0

Excepto que borrar es una palabra clave y por lo tanto no puede ser el nombre de nada. –

+0

Parece que esto (y la actualización de la pregunta) mezcla el tipo T con un valor de tipo T. – Potatoswatter

5

¿Qué tal algo como:

template <typename Container> 
void delete_all(const Container& c) 
{ 
    typedef typename Container::value_type Value; 
    std::for_each(c.begin(), c.end(), [](const Value& v){ delete v; }); 
} 

Tenga en cuenta que esto no eliminar los punteros desde el contenedor, por lo que Debe tener mucho cuidado con lo que hace con el contenedor y los punteros que contiene después de llamar a esto.

+0

Gracias por capturar el desaparecido T.clear() – rubenvb

1

¿Estás interesado específicamente en lambdas?

Si está utilizando impulso puede escribir:

for_each(c.begin(), c.end(), boost::checked_delete<Container::value_type>); 
Cuestiones relacionadas