> 백엔드 개발 > C++ > 반복하는 동안 std::list에서 요소를 안전하게 제거하는 방법은 무엇입니까?

반복하는 동안 std::list에서 요소를 안전하게 제거하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-18 22:59:12
원래의
388명이 탐색했습니다.

How to Safely Remove Elements from a std::list While Iterating?

반복 중 std::list에서 요소를 안전하게 제거

문제

다음 코드를 고려하세요.

for (std::list<item*>::iterator i = items.begin(); i != items.end(); i++)
{
    bool isActive = (*i)->update();
    // if (!isActive) items.remove(*i);
    // else other_code_involving(*i);
}
items.remove_if(CheckItemNotActive);
로그인 후 복사

목표는 비활성 항목을 업데이트한 후 즉시 목록에서 제거하여 두 번째 단계가 필요하지 않도록 하는 것입니다. 그러나 주석 처리된 행을 사용하여 루프 내의 요소를 제거하려고 하면 "목록 반복자는 증분할 수 없습니다."라는 오류가 발생합니다.

해결책

반복 중에 요소를 안전하게 제거하는 열쇠는 다음과 같습니다. 올바른 작업 순서. 위에 표시된 for 루프 접근 방식 대신 아래에 설명된 대로 코드를 while 루프로 수정해야 합니다.

std::list<item*>::iterator i = items.begin();
while (i != items.end())
{
    bool isActive = (*i)->update();
    if (!isActive)
    {
        items.erase(i++);  // alternatively, i = items.erase(i);
    }
    else
    {
        other_code_involving(*i);
        ++i;
    }
}
로그인 후 복사

먼저 반복자(i )를 증가시키면 반복자는 유효한 상태로 유지되며 제거하는 데 사용할 수 있습니다. 비활성 요소.

설명

원래 for 루프에서 다음을 사용하여 요소를 제거하려고 시도했습니다. 루프 본문 내의 items.remove(*i)가 반복자(i)를 무효화하여 후속 반복이 실패하게 됩니다. while 루프는 요소가 제거되기 전에 반복자가 업데이트되도록 보장하여 다음 반복에 대한 유효성을 보장합니다. items.erase(i ) 또는 i = items.erase(i)를 사용하면 해당 요소가 목록에서 제거되고 반복자는 다음 유효한 요소를 가리키도록 자동으로 업데이트됩니다.

이 접근 방식을 사용하면 목록을 별도로 통과할 필요 없이 반복 중에 비활성 항목을 효율적으로 제거합니다.

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

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