lambda+for_each+delete на контейнерах STL

Я пытаюсь добраться, простое удаляют каждый указатель в моем 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();
}
8
задан Brian Tompsett - 汤莱恩 6 July 2015 в 19:48
поделиться

3 ответа

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

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

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

Удалить их с помощью оператора delete:

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

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

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

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

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

9
ответ дан 5 December 2019 в 11:22
поделиться

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

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

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

5
ответ дан 5 December 2019 в 11:22
поделиться

Вас интересуют именно ламбды?

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

for_each(c.begin(), c.end(), boost::checked_delete<Container::value_type>);
1
ответ дан 5 December 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: