template<class ForwardIt, class UnaryPredicate>
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p)
{
first = std::find_if(first, last, p);
if (first != last)
for(ForwardIt i = first; ++i != last; )
if (!p(*i))
*first++ = std::move(*i);
return first;
}
p가 false를 반환할 때 그 값을 first가 가리키고 있는 값으로 옮기는 것을 알 수 있다. 따라서 p가 true이도록 하는 값이 삭제됨을 알 수 있다. 이 말이 이해가 되지 않으면 여기서 std::remove에 대한 부분을 참고하기 바란다. remove_if함수를 사용하는 코드를 보면서 이를 이해해보자.
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto FilterOdd = [](int n) {
return n % 2 == 1;
};
nums.erase(std::remove_if(nums.begin(), nums.end(), FilterOdd), nums.end());
for (int num: nums) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
// output : 2, 4, 6, 8, 10
FilterOdd함수는 n이 홀수일 때 true를 반환한다. 따라서 std::remove_if에 FilterOdd를 전달하면 홀수값이 삭제된다.