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

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

Patricia Arquette
Patricia Arquette원래의
2025-01-04 15:31:40491검색

How to Safely Iterate and Remove Elements from a std::list?

std::list에서 요소 반복 및 제거

std::list를 반복하는 동안 std::list에서 요소를 제거하려면 주의 깊게 처리해야 합니다. 반복자를 무효화하지 마십시오. 일반적인 오해 중 하나는 평가 직후 요소를 제거하면 반복자가 올바르게 증가한다고 가정하는 것입니다. 그러나 이 접근 방식은 "List iterator not incrementable" 오류로 이어집니다.

반복자 동작 이해

std::list에서 요소는 연속적으로 할당됩니다. 요소가 제거되면 후속 요소가 이동하여 빈 공간을 채웁니다. 결과적으로 처음에 제거된 요소를 가리키는 반복자는 유효하지 않게 됩니다. 이 반복자를 증가시키면 정의되지 않은 동작이 발생합니다.

올바른 접근 방식: 먼저 증가하고 나중에 제거

반복하는 동안 요소를 올바르게 제거하려면 다음 전략을 채택하십시오.

  1. 반복자를 먼저 증가시킵니다. i를 사용하여 아무것도 제거하기 전에 반복자를 다음 요소로 이동합니다.
  2. 이전 요소 제거: items.erase(i)를 사용하여 현재 위치 이전의 요소를 제거합니다. 여기서 i는 다음 요소에 대한 반복자입니다. 또는 i = items.erase(i);를 사용할 수 있습니다. 동일한 결과를 얻으려면

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;
    }
}

이 수정된 코드는 목록 전체를 반복하며 다음을 수행합니다.

  1. 각 항목에 대해 update()를 호출합니다.
  2. 항목이 비활성인 경우 이를 제거하고 반복자를 다음 요소로 이동합니다.
  3. 항목이 활성인 경우 다른 코드를 실행하고 반복자를 증가시킵니다.

Remove_if 접근 방식 피하기

원래 코드에는 루프 뒤에 Remove_if() 호출이 포함되어 있습니다. 이 접근 방식은 목록에 대한 추가 전달이 필요하기 때문에 일반적으로 권장되지 않습니다. 위에 표시된 것처럼 한 번에 반복하고 제거하는 것이 더 효율적이고 간단한 솔루션입니다.

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

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