공부/C || C++

remove와 remove_if

sudo 2022. 9. 30. 20:12
template <class ForwardIterator, class T>
ForwardIterator remove(ForwardIterator first, ForwardIterator last,
                       const T& val);

template< class ForwardIt, class UnaryPredicate >
ForwardIt remove_if( ForwardIt first, ForwardIt last, UnaryPredicate p );

제목에서부터 알 수 있듯이 소개할 remove와 remove_if 함수는 특정 원소를 지워주는게 아니라, 3번째 인자 뒤에 존재하는 3번째 인자에 해당하지 않는 값으로 덮어써서 3번째 인자를 뒤로 몰아줄 뿐이다. 따라서 찾은 값을 지우고 싶다면 반드시 erase함수를 한번 더 호출해줘야 한다. 찾은 값을 뒤의 값으로 덮어 써주고 몰아준다는 의미는 아래 그림과 같다. 예를 들어 (1, 7, 3, 3, 3, 3, 6, 5, 0, 3)라는 문자열에 대해 3번째 인자로 3을 주고 remove를 호출하면 아래 그림과 같은 일어난다.

설명한 것 처럼 remove나 remove_if는 지우는게 아니라 뒤의 값으로 덮어써줄 뿐이다. 완전한 삭제가 아니다. iterator가 가리키는 값부터 뒤의 값들은 의미 없는 값들이므로 iterator가 가리키는 값부터 끝까지 모두 지워주면 3번째 인자를 모두 지운 결과가 된다. 물론 capasity가 늘어나있을 것이므로 남아있는 원소의 개수에 맞게 resize해주면 좋다.

헤더

<Algorithm>

인자

우선 remove와 remove_if의 1,2번째 인자는 검사할 범위로, [first, last) 범위에 대해 검사한다. remove의 경우 3번째 인자는 찾을 값이고, remove_if의 경우 찾을 조건에 해당하는 함수나 람다 표현식을 써주면 된다

리턴값

지워지지 않은 원소 바로 뒤의 iterator 리턴

예시

bool CheckZero(int num)
{
    return num == 0;
}

int main()
{
    vector<int> citations;

    citations.emplace_back(1);
    citations.emplace_back(7);
    citations.emplace_back(3);
    citations.emplace_back(6);
    citations.emplace_back(5);
    citations.emplace_back(3);
    citations.emplace_back(0);

    // 1 7 6 5 0
    citations.erase(std::remove(citations.begin(), citations.end(), 3), citations.end());
    // 1 7 6 5
    citations.erase(std::remove_if(citations.begin(), citations.end(), CheckZero), citations.end());

    list<int> test;

    test.emplace_back(7);
    test.emplace_back(1);
    test.emplace_back(3);
    test.emplace_back(6);
    test.emplace_back(2);

    // 7 1 3 2
    test.erase(std::remove(test.begin(), test.end(), 6), test.end());

    std::string testStr = "Hello, My Name is Minsoo";

    // Hello,MyNameisMinsoo
    testStr.erase(std::remove(testStr.begin(), testStr.end(), ' '), testStr.end());
}

 

 

 

Reference

https://modoocode.com/266

 

C++ 레퍼런스 - remove 와 remove_if 함수 (<algorithm>)

 

modoocode.com