我正在尝试使用超酷的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();
}
答案 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 containers或shared_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>);