> 백엔드 개발 > C++ > 본문

`std::Vector`에서 요소를 제거할 때 erasure-remove_if가 중복된 쌍을 남기는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-11 20:30:03
원래의
309명이 탐색했습니다.

Why does erase-remove_if leave behind duplicate pairs when removing elements from a `std::vector`?

쌍 제거를 위한 Erase-Remove_if 관용구

std::Vector에서 쌍을 제거하기 위해 erase-remove_if 관용구를 사용하려고 할 때< std::pair>에서는 특이한 문제가 발생합니다. 제거를 위해 .first 값이 4인 쌍을 대상으로 함에도 불구하고 초기 구현에서는 중복된 쌍이 남습니다.

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [&amp;](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));
로그인 후 복사

문제의 근본 원인은 불완전한 삭제 프로세스에 있습니다. std::erase_if는 일치하는 요소만 벡터의 끝으로 이동합니다. 제거되지는 않습니다. 제거를 완료하려면 std::remove_if에서 반환된 반복자를 삭제 시작점으로 사용하는 것이 올바른 접근 방식입니다.

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [](const stopPointPair stopPoint)-> bool 
                                       { return stopPoint.first == 4; }), 
                 stopPoints.end());
로그인 후 복사

Erase-Remove_if 메커니즘 이해:

  • 요소 교환: std::remove_if는 벡터 내의 요소를 교환하여 일치하지 않는 모든 요소를 ​​처음으로 밀어냅니다. 일치하는 요소는 벡터의 뒤쪽에 옵니다.
  • 조건자 반복: 조건자 람다 표현식은 제거할 요소를 결정합니다. 조건자가 true를 반환하면 해당 요소는 벡터의 끝으로 이동됩니다.
  • 반복자 검색: std::remove_if는 조건자와 일치하는 첫 번째 요소를 가리키는 반복자를 반환합니다. 이 반복자는 제거할 요소의 시작을 표시합니다.
  • 벡터 삭제: std::벡터::erase는 반환된 반복자에서 시작하여 벡터의 요소까지 확장하여 범위 삭제 작업을 호출합니다. 끝. 이 단계는 벡터에서 일치하는 모든 요소를 ​​제거합니다.

자세한 내용은 [Erase-Remove Idiom](https://en.wikipedia.org/)에서 Wikipedia 문서를 참조하세요. wiki/Erase-remove_idiom).

위 내용은 `std::Vector`에서 요소를 제거할 때 erasure-remove_if가 중복된 쌍을 남기는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿