std::list를 이터레이트 하면서 element를 지우려면 어떻게 하나요?
조회수 3105회
소스코드
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);
발생하는 문제 및 실행환경
!isActive
에서 inactive 아이템을 바로바로 제거하고 싶은데
주석을 지우면 i++
를 할 때 List iterator not incrementable
에러가 발생합니다.
i++
하지 않는 방법도 해봤는데 똑같은 에러가 발생했어요.
list를 이터레이트하면서 원소를 지우려면 어떻게 해야 되나요?
1 답변
-
i
를 remove한 후i++
해서 그렇습니다. i가 이제 없으니 연산을 할 수 없는 상태가 되어서 에러가 발생하지요.j=i
같이i
를 어딘가에 저장한 후,i++
를 하고j
로 원소를 지워야 합니다. 코드를 다음과 같이 바꿔주세요std::list<item*>::iterator i = items.begin(); while (i != items.end()) { bool isActive = (*i)->update(); if (!isActive) { items.erase(i++); // 혹은 i = items.erase(i); } else { other_code_involving(*i); ++i; } }
댓글 입력