"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C++에서 `std::remove`와 `std::erase`의 차이점은 무엇입니까?

C++에서 `std::remove`와 `std::erase`의 차이점은 무엇입니까?

2024년 11월 11일에 게시됨
검색:178

 What\'s the Difference Between `std::remove` and `std::erase` in C  ?

std::erase와 std::remove의 차이점 이해

std::remove 알고리즘은 다음과 같은 작업을 수행하도록 설계된 다목적 도구입니다. 모든 정방향 반복기 쌍에 적용되므로 광범위한 컨테이너 및 시나리오에 적용할 수 있습니다. 컨테이너에서 요소를 효과적으로 삭제하고 제거하는 std::erase와 달리 std::remove는 요소만 재정렬합니다.

1. std::remove

std::remove의 뉘앙스 파악은 컨테이너를 논리적으로 두 섹션, 즉 제거할 요소가 포함된 섹션과 나머지 요소가 포함된 섹션으로 분할하는 방식으로 작동합니다. 컨테이너를 반복하고 제거되지 않은 요소를 앞으로 이동하여 제거된 요소를 효과적으로 덮어쓰는 방식으로 이를 수행합니다. 그러나 std::remove는 실제로 삭제된 요소를 지우지 않는다는 점에 유의하는 것이 중요합니다. 메모리에는 남아 있지만 보기에서는 효과적으로 숨겨집니다.

이 동작은 컨테이너 size() 함수와 함께 std::remove를 사용할 때 분명해집니다. std::remove를 사용하여 요소를 제거한 후 std::size()는 일부 요소가 논리적으로 삭제되더라도 계속해서 컨테이너의 원래 크기를 반환합니다. 컨테이너의 크기는 숨겨진 요소를 물리적으로 제거하기 위해 std::erase를 사용한 후에만 변경됩니다.

2. std::remove

의 영향 시각화 원래 질문에 제공된 코드 조각을 고려하십시오.

std::vector a;
a.push_back(1);
a.push_back(2);

std::remove(a.begin(), a.end(), 1);

int s = a.size();

std::remove를 실행한 후에도 벡터에는 여전히 두 요소(2와 2)가 포함되어 있지만 첫 번째 요소(1)는 논리적으로 삭제되어 보기에서 숨겨집니다. 따라서 숨겨진 삭제된 요소가 있음에도 불구하고 std::size()는 2를 반환합니다.

3. 물리적 제거를 위해 std::erase 사용

삭제된 요소를 물리적으로 제거하고 컨테이너 크기를 업데이트하려면 std::erase가 작동합니다. std::remove가 반환한 반복자 쌍을 첫 번째 인수로 사용하여 std::erase를 호출하면 숨겨진 삭제된 요소를 제거하고 컨테이너의 크기를 줄일 수 있습니다.

a.erase(std::remove(a.begin(), a.end(), 1), a.end());

이 경우 std::erase는 요소 1을 물리적으로 제거하고 벡터에는 단일 요소만 남깁니다. (2) 업데이트된 크기 1.

4. std::remove 유틸리티의 범위 이해

std::remove는 std::erase와 함께 사용하도록 설계되지 않았지만 논리적 파티셔닝이 있는 다양한 시나리오에서 광범위하게 사용됩니다. 요소가 필요합니다. 예를 들어, std::remove를 사용하여 다음을 수행할 수 있습니다.

  • 특정 기준을 충족하는 파티션 요소와 그렇지 않은 요소를 비교합니다.
  • 유사한 요소를 함께 그룹화합니다.
  • 특정 요소 또는 요소 집합의 위치를 ​​찾습니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3