[C++] std::remove_if

keltion·2022년 5월 23일

C++

목록 보기
4/5
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를 전달하면 홀수값이 삭제된다.

0개의 댓글