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

+ Recent posts