"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 왜 `std::벡터`에서 요소를 제거할 때 삭제-제거_if가 중복된 쌍을 남기나요?

왜 `std::벡터`에서 요소를 제거할 때 삭제-제거_if가 중복된 쌍을 남기나요?

2024년 12월 23일에 게시됨
검색:543

>, 특이한 문제가 발생합니다. 제거를 위해 .first 값이 4인 대상 쌍에도 불구하고 초기 구현에서는 중복 쌍이 남습니다:

Why does erase-remove_if leave behind duplicate pairs when removing elements from a `std::vector`? 
stopPoints.erase(std::remove_if(stopPoints.begin(), stopPoints.end(), [&](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)-> 부울 { return stopPoint.first == 4; }), stopPoints.end());

Erase-Remove_if 메커니즘 이해:
stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));

stopPoints.erase(std::remove_if(stopPoints.begin(),
                                stopPoints.end(),
                                [](const stopPointPair stopPoint)-> bool 
                                       { return stopPoint.first == 4; }), 
                 stopPoints.end());
std::remove_if는 요소를 교체합니다. 벡터 내에서 일치하지 않는 모든 요소를 ​​시작 부분으로 밀어 넣습니다. 일치하는 요소는 벡터의 뒤쪽에 있습니다.

조건자 반복:

조건자 람다 표현식은 제거할 요소를 결정합니다. 조건자가 true를 반환하면 해당 요소는 벡터의 끝으로 이동됩니다.
  • Iterator Retrieval: std::remove_if는 조건자와 일치하는 첫 번째 요소를 가리키는 반복자를 반환합니다. 이 반복자는 제거할 요소의 시작을 표시합니다.
  • Vector Erasure: std::벡터::erase는 반환된 반복자에서 시작하여 벡터의 요소까지 확장하여 범위 삭제 작업을 호출합니다. 끝. 이 단계는 벡터에서 일치하는 모든 요소를 ​​제거합니다.
  • 자세한 내용은 [Erase-Remove Idiom](https://en.wikipedia.org/)에 대한 Wikipedia 문서를 참조하세요. wiki/Erase-remove_idiom)
  • .
최신 튜토리얼 더>

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

Copyright© 2022 湘ICP备2022001581号-3