>백엔드 개발 >C++ >반복 중에 std::벡터에서 요소를 안전하게 지우는 방법은 무엇입니까?

반복 중에 std::벡터에서 요소를 안전하게 지우는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-01 12:24:02976검색

How to Safely Erase Elements From a std::vector During Iteration?

반복 중 std::Vector에서 요소 지우기: 전략 및 성능

지워야 하는 동안 std::Vector를 반복하는 경우 조건을 기반으로 요소를 사용하는 경우 반복자와 함께 for 루프를 사용하는 기존 접근 방식에는 문제가 발생할 수 있습니다. 요소를 지우면 반복자가 무효화되어 루프가 불완전해집니다. 이 문제를 해결하기 위해 이러한 시나리오를 처리하기 위한 최적의 전략을 살펴보겠습니다.

무효화 추적으로 반복

한 가지 접근 방식은 요소 삭제로 인한 반복기 무효화를 명시적으로 추적하는 것입니다. 제공된 샘플 코드에서:

<code class="cpp">for (iterator it = begin; it != end(container) /* !!! */; )
{
    if (it->somecondition())
    {
        it = vec.erase(it); // Returns the new iterator to continue from.
    }
    else
    {
        ++it;
    }
}</code>

여기서 주요 차이점은 미리 계산된 end 대신 end(container)를 사용한다는 것입니다. 이는 각 삭제 작업 후에 반복기 참조를 업데이트합니다. 이렇게 하면 루프 중에 유효한 반복기 비교가 보장됩니다.

std::remove_if와 삭제 결합

보다 효율적인 접근 방식은 std::remove_if와 삭제 기능을 결합하는 것입니다. 이는 무효화 추적의 필요성을 제거하여 프로세스를 최적화합니다.

<code class="cpp">iterator it = std::remove_if(begin, end, pred);
vec.erase(it, vec.end());</code>

여기서 pred는 제거할 요소를 결정하는 제거 조건자를 나타냅니다. 이 접근 방식은 반복 삭제와 관련된 O(N^2) 복잡성을 제거하고 성능을 O(N)으로 향상시킵니다.

예제 애플리케이션

제공된 코드 샘플에서, RemoveTimedEvent 구조체는 시간이 지정된 이벤트 벡터에서 특정 위젯과 관련된 이벤트를 식별하고 제거하는 제거 조건자 역할을 합니다.

이러한 전략 중 하나를 활용하면 작업 중에 std::Vector에서 요소를 효과적으로 지울 수 있습니다. 올바른 반복기 기능과 성능을 유지하면서 반복합니다.

위 내용은 반복 중에 std::벡터에서 요소를 안전하게 지우는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.