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

rub*_*nvb 8 c++ lambda stl delete-operator c++11

我试图简单地删除我的vector/list/...函数中的每个指针,用超酷的lambda函数编写.

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

我不知道该怎么填补???的.任何帮助是极大的赞赏!

更新:它应该是这样的:

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

Ste*_*sop 9

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

mydelete()在每个指针上调用该函数(假设您已定义了mydelete()成员函数):

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

要使用delete运算符删除它们:

for_each(c.begin(), c.end(), [](typename T::value_type x){ delete x; } );
Run Code Online (Sandbox Code Playgroud)

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

for(auto x : c) { delete x; }
Run Code Online (Sandbox Code Playgroud)

我注意到对容器进行const引用并删除其中的所有内容有点狡猾,尽管语言不会因为指针而阻止你.但是,你确定这是一个"持续"的操作,在容器的含义和使用范围内?

如果您正在编写此代码,那么您可能会受益于Boost指针容器或容器shared_ptr.


Jam*_*lis 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; });
}
Run Code Online (Sandbox Code Playgroud)

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