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
728x90
'Software Development > C, C++' 카테고리의 다른 글
c++ fold expression(since C++17) (0) | 2021.08.31 |
---|---|
DALi code review - C++ 코드리딩, 람다 코드 이해하기 (0) | 2021.02.03 |
[C++] 템플릿(Template)에 대한 이해와 함수 템플릿 (0) | 2019.03.10 |
[C++]new, delete 연산자 오버로딩 (0) | 2019.01.13 |
[C++] 배열 인덱스 연산자 오버로딩 [] (1) | 2019.01.12 |