2012-05-22 7 views

답변

17

사용 copy_if :

#include <algorithm> // for copy_if 
#include <iterator> // for back_inserter 

std::vector<MyType> v2; 
std::copy_if(v1.begin(), v1.end(), std::back_inserter(v2), 
      [](MyType const & x) { return simple_citerion(x); }); 
+2

은 젠, 10 초! +1 – Xeo

+2

그러나 'copy_if'는 C++ 11에서만 사용된다는 점에 유의해야합니다. –

+4

@EitanT : C++ 03에 대해'remove_copy_if'를 남용 할 수 있습니다. 단, 술어를 뒤집을 수 있습니다. – Xeo

7

부스트의 조금을 사용하여 수행 할 수 있습니다

std::vector<int> v = {1,2,-9,3}; 

for (auto i : v | filtered(_arg1 >=0)) 
    std::cout << i << "\n"; 

이 샘플 표현 템플릿 (_arg1 >= 0)에 의해 정의 된 암시 적 람다에 대한 피닉스를 사용하지만, 당신이 사용할 수있는 부스트 어댑터가있는 호출 가능 (C++ 03 이상)

자세한 내용은 여기를 참조하십시오. L 예 :

+0

또 다른 좋은 방법은 필요한 경우 Boost.Range를 확장하여 결과를 임시로 저장하지 않고 필터링 된 결과에서 새 벡터를 만들 수 있습니다. – Xeo

관련 문제