Frage

Ich versuche, eine einfach zu bekommen jeden Zeiger in meiner Vektor / list / ... Funktion löscht mit einer ultra coolen Lambda-Funktion geschrieben.

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

Ich habe keine Ahnung, was in für die ??? 's zu fü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();
}
War es hilfreich?

Lösung

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

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

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

So löschen Sie den Löschoperator:

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

Auch Lambda ist 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 auf einen Behälter, der eine const Bezug zu nehmen, und löschen alles drin, obwohl die Sprache wegen nicht Sie stoppen, was Zeiger sind. Sind Sie sicher, dass eine „Konstante“ Betrieb ist, wenn innerhalb der Bedeutung und Verwendung des Containers?

Wenn Sie diesen Code schreiben, vielleicht würden Sie profitieren von Boost-pointer Behälter oder Container von shared_ptr.

Andere Tipps

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 dies nicht Entfernen die Zeiger aus dem Behälter, so müssen Sie sehr vorsichtig sein, was Sie mit dem Behälter zu tun und die Zeiger enthält, nachdem Sie das nennen.

Haben Sie Interesse speziell in lambdas?

Wenn Sie Boost verwenden können Sie schreiben:

for_each(c.begin(), c.end(), boost::checked_delete<Container::value_type>);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top