2010-05-19 60 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>);