2010-05-19 10 views
8

Ich versuche ein einfaches Löschen jedes Zeigers in meiner Vektor/Liste/... Funktion mit einer ultra coolen Lambda-Funktion geschrieben.Lambda + for_each + löschen auf STL-Containern

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

Ich habe keine Ahnung, was für die ??? 's ausfüllen. Jede Hilfe wird sehr geschätzt!

UPDATE: Dies ist, wie es aussehen sollte:

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

Sie werden 'cont' nicht-const, um' clear() 'auf, nennen es machen müssen. Und rufen Sie es auf "cont", nicht T; -p –

+0

Wenn Sie Pointer-Container benötigen, werfen Sie einen Blick auf die Boost Pointer Container-Bibliothek (http://www.boost.org/doc/libs/1_43_0/libs/ptr_container/ doc/ptr_container.html). – Philipp

+0

Nehmen Sie keinen Behälter als Referenz. Verwenden Sie Iteratoren. – pmr

Antwort

9

Zwei Fragen hier: die Lambda-Syntax selbst, und wie der Wert Typ eines Behälters zu erhalten:

die mydelete() Funktion auf jeden Zeiger aufrufen (vorausgesetzt, Sie eine mydelete() Memberfunktion definiert haben):

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

sie löschen den Löschoperator:

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

auch ist Lambda nicht unbedingt die coolste neue Funktion in C++ 11 für ein gegebenes Problem:

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

Ich möchte anmerken, dass es ein bisschen vertrackt ist ein const Bezug auf einen Behälter zu nehmen, und löschen Sie alles drin, obwohl die Sprache, die Sie nicht stoppen wegen dem, was Zeiger sind. Sind Sie sicher, dass es sich um eine "konstante" Operation handelt, die sich auf die Bedeutung und Verwendung Ihres Containers bezieht?

Wenn Sie diesen Code schreiben, profitieren Sie möglicherweise von Boost pointer containers oder Containern von shared_ptr.

+0

Zwei gute Antworten, aber diese ich mag besser (Operator <-> Element Funktion löschen + eine Zeile). Danke – rubenvb

+0

Ausgenommen das Löschen ist ein Schlüsselwort und folglich kann der Name von nichts sein. –

+0

Sieht so aus (und die Frage Update) mischt Typ T mit einem Wert vom Typ T. – Potatoswatter

5

Wie wäre es so etwas wie:

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; }); 
} 

Beachten Sie, dass diese nicht die Zeiger aus dem Behälter entfernen, so dass Sie Sie müssen sehr vorsichtig sein, was Sie mit dem Container und den darin enthaltenen Zeigern tun, nachdem Sie dies aufgerufen haben.

+0

Danke für das Abfangen der fehlenden T.clear() – rubenvb

1

Interessieren Sie sich speziell für Lambdas?

Wenn Sie Boost verwenden Sie schreiben können:

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