최근에 다음 함수에서 버그를 수정했는데 그 대답이 저를 놀라게했습니다. 나는 기능 다음 (나는 버그를 발견하기 전에 그것이로 작성) 한 :이 기능은 특정 위치가 '항목'에서 그들을 제거 '항목'벡터의 모든 Item
개체를 발견std :: vector :: end()에 대한 질문
void Level::getItemsAt(vector<item::Item>& vect, const Point& pt)
{
vector<itemPtr>::iterator it; // itemPtr is a typedef for a std::tr1::shared_ptr<item::Item>
for(it=items.begin(); it!=items.end(); ++it)
{
if((*it)->getPosition() == pt)
{
item::Item item(**it);
items.erase(it);
vect.push_back(item);
}
}
}
을하고, 그들을 'vect'에 넣는다. 나중에 putItemsAt
이라는 함수는 그 반대를 수행하고 'items'에 항목을 추가합니다. 처음으로 getItemsAt
이 정상적으로 작동합니다. 그러나 putItemsAt
이 호출 된 후에는 getItemsAt
의 for 루프가 '항목'의 끝에서 실행됩니다. '그것은'잘못된 Item
포인터를 가리키고 getPosition()
은 segfaults입니다. 직감적으로, 나는 it!=items.end()
을 it<items.end()
으로 변경했다. 아무도 그 이유를 말할 수 있습니까? 주위를 둘러 보는 것은 반복자를 무효화하는 것이 포함될 수도 있지만 여전히 처음부터 어떻게 작동하는지 이해하지 못한다.
목록의 지우기가 더 효율적이기 때문에 벡터에서 목록으로 '항목'을 변경하려고하므로 궁금합니다. <
연산자가 없으므로 목록에 !=
을 사용해야한다는 것을 알고 있습니다. 목록을 사용하여 동일한 문제가 발생합니까?
-1 : 게시 한 코드는 for 루프를 while 루프로 바꾸는 것 외에는 아무 것도 수행하지 않습니다. 여전히 유효하지 않습니다. –
@Billy :별로. 그는 지우는 말을 바로 잡았습니다. "it = items.erase (it)"문은 새로운 유효한 값을 할당합니다. –
@Peter : vect는 항목과 다른 벡터이기 때문에 vect.push_back은이를 무효화하지 않습니다. –