개발/C, C++

[C++] std::remove & std::remove_if 이해하기

huiyu 2021. 2. 2. 06:00
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 : 범위(first~last)내에서 val과 일치하는 원소를 제거한 범위로 변환
- remove_if : 범위(first~last)내에서 조건 p를 만족하는 원소를 제거한 범위로 변환.
 -> 이 함수는 실제 원소를 제거하는 것이 아닌 지워야 하는 원소들을 컨테이너 맨 뒤로 보내버린다.
  ** 이때 이 두 함수는 해당 범위의 맨 끝을 가리키는 반복자를 리턴한다. 위 함수가 리턴하는 반복자부터 last까지 원소들이 지워야 하는 원소들이다. 이들을 지우기 위해선 추가적으로 erase함수를 호출해야한다.(아래 예제코드 참고)

[인자]
- first, last : 원소의 시작과 끝을 가리키는 반복자들.
- val : 삭제할 값
- p : 원소를 한 개만 가지는 단항 함수, p의 리턴값은 bool로 변환 가능해야 하며, p는 원소를 변경하면 안된다.

[리턴값]
지워지지 않은 마지막 원소 바로 뒤를 가리키는 반복자를 리턴, 즉 first부터 함수가 리턴하는 반복자 바로 전까지는 val과 일치하지 않는 원소를 의미한다.

remove와 remove_if 구현예시

template <class ForwardIt, class T>
ForwardIt remove(ForwardIt first, ForwardIt last, const T& value) {
  first = std::find(first, last, value);
  if (first != last)
    for (ForwardIt i = first; ++i != last;)
      if (!(*i == value)) *first++ = std::move(*i);
  return first;
}
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;
}

실행예제

#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>

int main() {
  std::string str1 = "Text with some   spaces";
  // 문자열에서 띄어쓰기를 모두 지운다.
  str1.erase(std::remove(str1.begin(), str1.end(), ' '), str1.end());
  std::cout << str1 << '\n';

  std::string str2 = "Text\n with\tsome \t  whitespaces\n\n";
  // 문자열에서 공백 문자 (띄어쓰기, 개행 문자 등등)를 지운다.
  str2.erase(std::remove_if(str2.begin(), str2.end(),
                            [](unsigned char x) { return std::isspace(x); }),
             str2.end());
  std::cout << str2 << '\n';
}

결과
Textwithsomespaces
Textwithsomewhitespaces

 

[참고]
아래 사이트는 C++ 설명이 잘되어있다. 자주 참고하고 공부하자!
modoocode.com/266

 

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

 

modoocode.com

 

728x90
반응형