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

조회수 3082회

소스코드

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 답변

  • 좋아요

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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)