vector<list<T*>> 객체 삭제와 관련된 질문입니다..

vector<list<CObj*>> m_vecObj;

for (UINT i = 0; i < iSize; ++i)

{

    list<CObj*>::iterator iter = m_vecObj[i].begin();
    for (; iter != m_vecObj[i].end(); ++iter)
    {

        if (i == MISSILE)
        {
            if ((*iter)->GetPos().y < n)
            {
                ******m_vecObj[MISSILE].pop_front(); ****** < -요줄이 문제
                (위에만 강조할려고 *를 사용했습니다.)
            }
            else
            {
                (*iter)->update();
            }
        }
        else
        {
            (*iter)->update();
        }



    }

}

이 코드는 전체 코드중 일부인데요. 코드의 목적은 플레이어가 발사한 미사일이 특정 영역 밖으로 나가면 삭제를 할려고 합니다. ( 그래서 y 값이 n보다 작아지면 삭제처리) 그런데 *친 곳이 잘못 되었는지 expression: cannot increment value-initialized list iterator 이렇게 에러창이 뜨면서 #include 의 list의 line:202 등등 뭐 이렇게 적혀있더라고요.

코드가 *친 곳 말고도 추가적인 실수가 있다면 알려주시기 바랍니다. 추가적으로 erase와 remove의 차이도 알려주시면 감사하겠습니다.

부가 설명: 미사일은 y방향으로만 이동하며 속도는 고정되어있습니다. 그래서 pop front를 사용한 것은 어차피 제일 먼저 발사한 미사일이 삭제될 것이기 때문입니다.

GetPos()라는 함수는 제가 구현한 함수로 물체의 위치값을 알려주는 함수입니다.

update는 매번 호출되는 함수로 모든 것들을 말 그대로 update시키는 기능을 가진 함수입니다.

MISSILE 은 enum 클래스를 중 하나입니다. 인덱스 용도로 사용하고 있죠. (enum 클래스를 이용해서 간편하게 바로 인덱스로 접근하기 위한 용도)

이중백터를 사용하지않고 list를 사용한 이유는 어차피 하위부분은 모두 순환을 하면서 update를 시켜줘야 하고 또 중간에 예외가 발생하면 삭제를 해야 하는데 vector일 경우 재할당을 해야하나 list경우 간편하게 그 노드만 삭제를 할 수 있다고 들었습니다.

1답변

  • 좋아요

    1

    싫어요
    채택취소하기

    expression: cannot increment value-initialized list iterator 이라는 런타임 오류가 발생했단 말씀이지요?

    딱히 이상한 곳은 없는데 iSize의 값이 m_vecObj.size()보다 같거나 작나요?

    std::list::remove()는 입력한 인자와 동일한 값을 갖는 원소를 제거합니다. std::list::erase()는 iterator를 통해 특정 위치의 원소를 제거합니다. 예를 들면 아래와 같습니다.

    #include <iostream>
    #include <list>
    void print(std::list<int> const& list) {
        for (auto v : list)
            std::cout << v << " ";
        std::cout << "\n";
    }
    int main() {
        std::list<int> list = {1, 2, 3, 2, 4};
        print(list);
    
        list.erase(list.begin()); // 첫 위치의 원소가 제거됨
        print(list);
    
        list.remove(2); // 값이 2인 원소가 모두 제거됨
        print(list);
    
        return 0;
    }
    

    결과는 아래과 같이 나타납니다.

    1 2 3 2 4
    2 3 2 4
    3 4
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.