> 백엔드 개발 > C++ > 반복 중에 std::Vector에서 요소를 효율적으로 제거하는 방법은 무엇입니까?

반복 중에 std::Vector에서 요소를 효율적으로 제거하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-10-29 13:32:29
원래의
938명이 탐색했습니다.

How to Efficiently Remove Elements from a std::vector During Iteration?

반복 중 std::Vector에서 요소를 효율적으로 제거

std::Vector를 반복하고 삭제와 같이 벡터 크기를 수정해야 하는 작업을 수행하는 경우 요소를 사용하면 반복자를 무효화하는 문제가 발생할 수 있습니다. 이는 요소 제거에 사용되는 erasure() 메소드가 벡터의 크기를 변경하고 기존의 모든 반복자를 무효화하기 때문입니다.

잘못된 반복자 방지

이를 극복하기 위한 효율적인 솔루션은 반환 값을 사용하는 것입니다. 삭제된 요소 바로 다음 요소를 가리키는 새롭고 유효한 반복자를 제공하는 erasure() 메서드. 이를 통해 무효화된 반복기에 대해 걱정할 필요 없이 반복을 계속할 수 있습니다.

다음 코드는 이 접근 방식을 보여줍니다.

<code class="cpp">std::vector<std::string>::iterator iter;
for (iter = m_vPaths.begin(); iter != m_vPaths.end(); ) {
    if (::DeleteFile(iter->c_str())) {
        iter = m_vPaths.erase(iter);  // Returns a new valid iterator
    } else {
        ++iter;  // Advance iterator if file deletion failed
    }
}</code>
로그인 후 복사

이 코드에서 iter 반복자는 다음을 가리키도록 업데이트됩니다. 각 성공적인 파일 삭제 후 다음 요소를 사용하여 반복이 원활하게 진행될 수 있도록 합니다.

대체 데이터 구조

반복자 접근 방식을 사용하는 것이 효율적이기는 하지만 여전히 원본 m_vPaths 벡터를 수정하므로 성능이 향상될 수 있습니다. 여러 번 삭제해야 하는 경우 영향을 미칩니다. 이러한 경우 다음과 같이 요소를 효율적으로 삭제하는 데 최적화된 대체 데이터 구조를 사용하는 것이 더 나을 수 있습니다.

  • std::list: O(1) 시간 복잡도로 요소를 효율적으로 제거할 수 있는 목록입니다.
  • std::set: 중복된 요소를 자동으로 제거하고 효율적인 제거 작업을 지원하는 순서 집합
  • std::unordered_set: 효율적인 요소 제거도 지원하는 순서가 지정되지 않은 집합이지만 반복 순서가 보장되지는 않는다는 점에 유의하는 것이 중요합니다.

위 내용은 반복 중에 std::Vector에서 요소를 효율적으로 제거하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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