728x90
[C++] std::remove_if 를 이용한 요소 삭제
1. std::remove_if를 사용한 요소 삭제 std::vector< int > v1 = { -2, -1, 0, 1, 2 }; std::remove_if( v1.begin(), v1.end(), []( int InNum ) { return InNum < 0; } ); // 출력 0 1 2 1 2 for ( auto& num : v..
ggoom.tistory.com
1. std::erase_if를 이용한 요소 삭제
- C++ 20 이전에는 std::remove_if와 erase를 이용한 방법으로 요소를 삭제해왔다.
- 두 번의 함수 호출과, 반복자를 지정해야 한다는 불편함을 개선하고자 추가된 내용이다.
2. 사용 방법
std::vector< int > v1 = { -2, -1, 0, 1, 2 };
// 요소 0 삭제
std::erase( v1, 0 );
// 0 미만 삭제
std::erase_if( v1, []( int InNum ) { return InNum < 0; } );
// 출력 1 2
for ( auto num : v1 )
std::cout << num << " ";
- 기존 std::remove_if를 통해 반복자를 얻고, erase를 통해 삭제하는 방식에서 std::erase_if 호출 한 번으로 개선되었다.
3. std::erase_if 정의
template <class _Container, class _Pr>
_CONSTEXPR20 typename _Container::size_type _Erase_remove_if(_Container& _Cont, _Pr _Pred) {
// erase each element satisfying _Pred
auto _First = _Cont.begin();
const auto _Last = _Cont.end();
const auto _Old_size = _Cont.size();
_Seek_wrapped(_First, _STD remove_if(_Get_unwrapped(_First), _Get_unwrapped(_Last), _Pred));
_Cont.erase(_First, _Last);
return _Old_size - _Cont.size();
}
- 정의로 이동하게 되면, 함수 내부에서 remove_if를 호출하고 erase까지 호출하는 내용을 확인해볼 수 있다.
- 기존 erase-remove 방식을 그대로 차용하되, 사용자 편의를 개선한 내용임을 확인할 수 있는 부분이다.
반응형
'C++ > C++ 20' 카테고리의 다른 글
[C++ 20] std::source_location을 이용한 로그 작성 (0) | 2022.02.26 |
---|---|
[C++ 20] std::span (0) | 2022.02.25 |
[C++ 20] 템플릿 람다 (0) | 2022.02.23 |
[C++ 20] consteval, constinit 지정자 (0) | 2022.02.23 |
[C++20] 지명 초기화 (0) | 2022.02.22 |