在STL容器上使用lambda + for_each + delete

时间:2010-05-19 20:00:53

标签: c++ c++11 lambda stl delete-operator

我正在尝试使用超酷的lambda函数编写一个简单的删除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 个答案:

答案 0 :(得分:9)

这里有两个问题:lambda语法本身,以及如何获取容器的值类型:

在每个指针上调用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; } );

此外,对于给定的问题,lambda不一定是C ++ 11中最酷的新功能:

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

我注意到将 const 引用带到容器并删除其中的所有内容有点狡猾,尽管语言不会因为指针而阻止你。但是,你确定这是一个“常量”操作,在容器的含义和使用范围内吗?

如果您正在编写此代码,那么您可能会从Boost pointer containersshared_ptr的容器中受益。

答案 1 :(得分:5)

如下:

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

请注意,这不会从容器中删除指针,因此在调用它之后,您需要非常小心对容器及其包含的指针所做的事情。

答案 2 :(得分:1)

你对lambdas特别感兴趣吗?

如果你正在使用提升,你可以写:

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