다음 코드를 고려하세요.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!