728x90

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 : v1 )
        std::cout << num << " ";
  • std::remove_if를 사용해 얻고자 한 결과는 크기가 3인 { 0, 1, 2 } 벡터지만, 결과는 크기가 줄어들지 않았다.
  • 이유는 std::remove_if는 삭제할 요소를 컨테이너 뒤쪽으로 옮기고, 새로운 반복자를 반환하는 함수이기 때문이다.
  • 결괏값이 { 0, 1, 2, -1, -2 }가 아닌 것은, 조건이 일치한 반복자를 일치하지 않는 반복자 위치에 덮어쓰기 때문이다.

 

2. erase - remove를 이용한 요소 제거

    // 예시 1번
    std::vector< int > v1 = { -2, -1, 0, 1, 2 };
    auto newEnd = std::remove_if( v1.begin(), v1.end(), []( int InNum ) { return InNum < 0;  } );

    // 획득한 반복자를 통해 요소 삭제
    v1.erase( newEnd, v1.end() );

    // 출력 0 1 2
    for ( auto& num : v1 )
        std::cout << num << " ";
    // 예시 2번
    std::vector< int > v1 = { -2, -1, 0, 1, 2 };
 
    // erase - remove 
    v1.erase( std::remove_if( v1.begin(), v1.end(), []( int InNum ) { return InNum < 0;  } )
              , v1.end() );

    // 출력 0 1 2 1 2
    for ( auto& num : v1 )
        std::cout << num << " ";
  • std::remove_if 함수를 통해, 삭제가 진행되어야 할 반복자를 얻을 수 있다.

3. 설명

-2 -1 0 1 2
삭제 -1 0 1 2
-1 0 1 2 X
  • 배열과 같이 특정 요소를 삭제하게 될 경우, 뒤에 있는 요소들을 이동시켜야 하는 연산 과정이 필요하다.
  • 단순 삭제 연산보다 요소들을 이동시키는 연산이 크고, 뒤에 불필요한 공간이 남는 불편함이 존재함
  • std::remove_if는 삭제할 요소들을 삭제하지 않을 요소들과 위치를 바꿔 불필요한 이동 연산을 진행하지 않음
  • erase 함수를 통해 일괄적으로 요소들을 삭제하기 때문에, 잦은 삭제로 인한 이동 연산이 필요 없어진다.

 

4. C++20 std::erase, std::erase_if

  • erase-remove 관용구처럼 사용되던 내용이 std::erase, std::erase_if로 사용할 수 있게 추가되었다.
 

[C++ 20] std::erase_if 를 이용한 요소 삭제

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.." data-og-host="ggoom.tistory.com" data-og-source-url=..

ggoom.tistory.com

 

[참고]

https://en.cppreference.com/w/cpp/algorithm/remove

반응형

'C++ > tip' 카테고리의 다른 글

[C++] 주석 팁  (1) 2022.02.19
728x90

/* */ 주석과 // 주석을 혼합한 형태

/* */ 주석과 // 주석을 혼합해 사용할 경우, 특정 내용 주석을 쉽게 On / Off 할 수 있다.

 

 

반응형

'C++ > tip' 카테고리의 다른 글

[C++] std::remove_if 를 이용한 요소 삭제  (2) 2022.02.25

+ Recent posts