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
[참고]
반응형
'C++ > tip' 카테고리의 다른 글
[C++] 주석 팁 (1) | 2022.02.19 |
---|