лямбда + for_each + удалить на контейнерах STL - PullRequest
8 голосов
/ 20 мая 2010

Я пытаюсь получить простое удаление каждого указателя в моей функции vector / list / ..., написанной с помощью очень крутой лямбда-функции.

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

Понятия не имею, что заполнять для ???.Любая помощь очень ценится!

ОБНОВЛЕНИЕ: Вот как это должно выглядеть:

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

Ответы [ 3 ]

9 голосов
/ 20 мая 2010

Здесь есть две проблемы: сам лямбда-синтаксис и как получить тип значения контейнера:

Чтобы вызвать функцию mydelete() для каждого указателя (при условии, что вы определили функцию-член mydelete()):

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

Чтобы удалить их с помощью оператора удаления:

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

Кроме того, лямбда не обязательно самая крутая новая функция в C ++ 11 для данной проблемы:

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

Я бы заметил, что немного глупо брать const ссылку на контейнер и удалять все в нем, хотя язык не останавливает вас из-за указателей. Вы уверены, что это «постоянная» операция, в смысле и использовании вашего контейнера?

Если вы пишете этот код, возможно, вам пригодятся Контейнеры повышения указателя или контейнеры shared_ptr.

5 голосов
/ 20 мая 2010

Как насчет чего-то вроде:

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

Обратите внимание, что это не удаляет указатели из контейнера, поэтому вам нужно быть очень осторожным в том, что вы делаете с контейнером и указателями, которые он содержит после того, как вы вызываете это.

1 голос
/ 21 мая 2010

Заинтересованы ли вы конкретно в лямбдах?

Если вы используете повышение, вы можете написать:

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