2010-05-19 3 views
8

아주 간단한 람다 함수로 작성된 vector/list/... 함수의 모든 포인터를 삭제하는 중입니다.STL 컨테이너의 lambda + for_each + delete

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

당신은 그것을') (삭제'를 호출하기 위해'있도록 cont' const가 아닌해야합니다. 그리고 T가 아니라'cont'라고 부르십시오. -p –

+0

포인터 컨테이너가 필요하면 Boost Pointer Container 라이브러리 (http://www.boost.org/doc/libs/1_43_0/libs/ptr_container/)를보십시오. doc/ptr_container.html). – Philipp

+0

참고로 용기를 가져 가지 마십시오. 반복자를 사용하십시오. – pmr

답변

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

가 나는 그것이 컨테이너에 const를 참조를 취할 조금 사기의 점에 유의하고 모든 것을 삭제할 것, 언어가 당신을 중지하지 않지만 포인터가 무엇 때문에. 컨테이너의 의미와 용도 내에서 그것이 "일정한"작동을 확신합니까?

이 코드를 작성하는 경우 Boost pointer containers 또는 shared_ptr 컨테이너의 이점을 누릴 수 있습니다.

+0

두 가지 좋은 답변이 있지만, 내가 더 좋아하는 (연산자 <-> 회원 기능 삭제 + 한 줄). 감사합니다 – rubenvb

+0

삭제가 키워드이기 때문에 아무것도 이름이 될 수 없습니다. –

+0

이것 (그리고 질문 업데이트)은 T 타입의 값과 타입 T를 혼합합니다. – Potatoswatter

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

1

특별히 람다에 관심이 있으십니까?

당신은 당신이 쓸 수 부스트를 사용하는 경우 :

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