8

我正在尝试简单地删除我的向量/列表/...函数中的每个指针,该函数使用超酷的 lambda 函数编写。

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

3 回答 3

9

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

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

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

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

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

如果您正在编写此代码,也许您会从Boost 指针容器shared_ptr.

于 2010-05-19T20:07:16.930 回答
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; });
}

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

于 2010-05-19T20:06:30.613 回答
1

你对 lambdas 特别感兴趣吗?

如果你使用 boost 你可以写:

for_each(c.begin(), c.end(), boost::checked_delete<Container::value_type>);
于 2010-05-21T10:09:43.300 回答