2010-05-19 28 views
8

Tôi đang cố gắng xóa đơn giản mọi con trỏ trong hàm vectơ/danh sách/... của tôi được viết bằng hàm lambda siêu mát mẻ.lambda + for_each + xóa trên vùng chứa STL

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

Tôi không biết phải điền thông tin gì cho ???. Bất kỳ trợ giúp nào cũng được đánh giá rất cao!

UPDATE: Đây là những gì nó sẽ giống như thế:

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

Bạn sẽ cần phải thực hiện 'cont' không const để gọi' rõ ràng() 'trên đó. Và gọi nó là 'cont', không phải T ;-p –

+0

Nếu bạn cần container con trỏ, hãy xem thư viện Boost Pointer Container (http://www.boost.org/doc/libs/1_43_0/libs/ptr_container/ doc/ptr_container.html). – Philipp

+0

Không dùng thùng chứa theo tham chiếu. Sử dụng trình vòng lặp. – pmr

Trả lời

9

Hai vấn đề ở đây: cú pháp lambda chính nó, và làm thế nào để có được những kiểu giá trị của một container:

Để gọi mydelete() chức năng trên mỗi con trỏ (giả sử bạn đã xác định một hàm mydelete() thành viên):

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

Để xóa chúng bằng cách sử dụng toán tử delete:

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

Ngoài ra, lambda không nhất thiết phải là tính năng mới thú vị nhất trong C++ 11 cho một vấn đề nhất định:

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

tôi muốn lưu ý rằng đó là một chút tinh ranh để có một const tham chiếu đến một container, và xóa mọi thứ trong nó, mặc dù ngôn ngữ không chỉ dừng lại bạn vì con trỏ là gì. Bạn có chắc chắn rằng đó là một hoạt động "liên tục", mặc dù, trong ý nghĩa và sử dụng container của bạn?

Nếu bạn đang viết mã này, có thể bạn sẽ được hưởng lợi từ số Boost pointer containers hoặc vùng chứa shared_ptr.

+0

Hai câu trả lời hay, nhưng câu trả lời này tôi thích hơn (điều hành <-> chức năng thành viên xóa + một dòng). Cảm ơn – rubenvb

+0

Ngoại trừ việc xóa là một từ khóa và do đó không thể là tên của bất cứ điều gì. –

+0

Có vẻ như điều này (và cập nhật câu hỏi) trộn lẫn loại T với giá trị loại T. – Potatoswatter

5

Làm thế nào về một cái gì đó như:

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

Lưu ý rằng đây không loại bỏ các con trỏ từ container, vì vậy bạn cần phải rất cẩn thận những gì bạn làm với các container và con trỏ nó chứa sau khi bạn gọi này.

+0

Cảm ơn bạn đã đánh bắt các thiếu T.clear() – rubenvb

1

Bạn có quan tâm đặc biệt đến lambdas không?

Nếu bạn đang sử dụng tăng bạn có thể viết:

for_each(c.begin(), c.end(), boost::checked_delete<Container::value_type>); 
Các vấn đề liên quan