2010-05-19 58 views
8

我试图让我的vector/list/...中的每个指针都被删除,这个指针用超酷的lambda函数编写。lambda + for_each +在STL容器上删除

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

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

UPDATE:这是它应该是什么样子:

template <typename Container> 
void delete_clear(Container &c) 
{ 
    for_each(c.begin(), c.end(), [](typename Container::value_type x){ delete x; }); 
    c.clear(); 
} 
+1

你需要做'cont'非const为了调用'明确()'就可以了。并在'cont'上调用它,而不是T; -p – 2010-05-19 20:12:02

+0

如果您需要指针容器,请查看Boost指针容器库(http://www.boost.org/doc/libs/1_43_0/libs/ptr_container/ DOC/ptr_container.html)。 – Philipp 2010-05-19 20:24:50

+0

请勿参照容器。使用迭代器。 – pmr 2010-05-19 20:28:55

回答

9

两个问题在这里:拉姆达语法本身,以及如何获得一个容器的值类型:

要调用每个指针mydelete()功能(假设你已经定义了一个mydelete()成员函数):

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

而且,拉姆达不一定是最酷的新功能:

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

要使用delete运算符删除C++ 11对于给定的问题:

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

我注意到,这是一个有点狡猾采取常量参考容器,并删除了所有的东西,虽然语言并不阻止你因为什么是指针。但是,您确定这是一个“常量”操作,但在容器的含义和用途范围内?

如果您正在编写此代码,也许您会受益于Boost pointer containers或容器shared_ptr

+0

两个很好的答案,但是这个我更喜欢(运算符<->成员函数delete +一行)。谢谢 – rubenvb 2010-05-19 20:10:30

+0

除了删除是关键字,因此不能成为任何东西的名称。 – 2010-05-19 20:16:00

+0

看起来像这样(和问题更新)混合类型T与类型T的值。 – Potatoswatter 2010-05-19 21:42:14

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

注意,这并不删除从容器中三分球,所以你在你调用它之后,你需要非常小心你对容器和它所包含的指针所做的事情。

+0

感谢您找到缺少的T.clear() – rubenvb 2010-05-19 20:12:49

1

您是否对lambdas有兴趣?

如果你使用boost你可以写:

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