std::list를 이터레이트 하면서 element를 지우려면 어떻게 하나요?


소스코드

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를 이터레이트하면서 원소를 지우려면 어떻게 해야 되나요?

  • 2016년 01월 24일에 작성됨

조회수 231


1 답변


좋아요
0
싫어요
채택취소하기

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;
    }
}
  • 2016년 01월 24일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close