std::list에서 요소 반복 및 제거
std::list를 반복하는 동안 std::list에서 요소를 제거하려면 주의 깊게 처리해야 합니다. 반복자를 무효화하지 마십시오. 일반적인 오해 중 하나는 평가 직후 요소를 제거하면 반복자가 올바르게 증가한다고 가정하는 것입니다. 그러나 이 접근 방식은 "List iterator not incrementable" 오류로 이어집니다.
반복자 동작 이해
std::list에서 요소는 연속적으로 할당됩니다. 요소가 제거되면 후속 요소가 이동하여 빈 공간을 채웁니다. 결과적으로 처음에 제거된 요소를 가리키는 반복자는 유효하지 않게 됩니다. 이 반복자를 증가시키면 정의되지 않은 동작이 발생합니다.
올바른 접근 방식: 먼저 증가하고 나중에 제거
반복하는 동안 요소를 올바르게 제거하려면 다음 전략을 채택하십시오.
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; } }
이 수정된 코드는 목록 전체를 반복하며 다음을 수행합니다.
Remove_if 접근 방식 피하기
원래 코드에는 루프 뒤에 Remove_if() 호출이 포함되어 있습니다. 이 접근 방식은 목록에 대한 추가 전달이 필요하기 때문에 일반적으로 권장되지 않습니다. 위에 표시된 것처럼 한 번에 반복하고 제거하는 것이 더 효율적이고 간단한 솔루션입니다.
위 내용은 std::list에서 요소를 안전하게 반복하고 제거하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!