본문 바로가기
프로그래밍 언어/C++

STL 알고리즘 - 원소 제거(remove, remove_if)

by Nighthom 2023. 2. 14.

해당 알고리즘은 <algorithm> 헤더파일에 정의되어 있다.

 

1. 사용 방법

1) remove

std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(3);
vec.push_back(5);

result = std::remove(vec.begin(), vec.end(), 3);

위와 같이 정의했을 경우 vec은

[1, 2, 3, 4, 3, 5] -> [1, 2, 4, 5, 3, 5]  // 3을 발견하면 왼쪽으로 한칸 shift, 또 3을 발견하면 해당값을 건너뛰어서 shift.

으로 변하게 된다. 그리고 3에 해당하는 이터레이터를 반환한다. 

 

즉, 해당 값의 이터레이터부터 end에 해당하는 iterator까지를 지워주면 3에 해당하는 값을 모두 삭제할 수 있다. 

vec.earse(std::remove(vec.begin(), vec.end(), 3), vec.end);

2) remove_if

template <typename Iter, typename Pred>
remove_if(Iter first, Iter last, Pred pred)

remove_if는 위와 같이 사용할 수 있다. pred에는 조건으로 사용할 함수 객체를 받는다. (함수 포인터를 받도록 할 수도 있다.)

struct is_odd {
    bool operator()(const int& i) { return i % 2 == 1; }
};

위와 같이 함수 객체를 정의하고, 사용할 때 다음과 같이 사용하면 홀수에 해당하는 정보를 모두 삭제할 수 있다.

vec.erase(std::remove_if(vec.begin(), vec.end(), is_odd()), vec.end());

 

댓글