작업 코드를 얻는 방법뿐만 아니라 여기에 대한 자세한 설명을 찾고 있습니다. 나는 요소를 지우는 훨씬 더 짧은 코드를 작성하는 법을 안다. 나는이 테스트 코드를 삭제시 실패 지점을 찾아내는 데 여기에 썼다. 그것은 반복자가 무효화 될뿐만 아니라 .end() 반복자가되는 것처럼 보일 것입니다 ... 그리고 그것은 흥미 롭습니다.반복자 유효 기간
왜 작동합니까?
deque<shared_ptr<Vehicle>> data;
data.push_back(shared_ptr<Vehicle>(new Vehicle("porsche")));
data.push_back(shared_ptr<Vehicle>(new Vehicle("fiat")));
data.push_back(shared_ptr<Vehicle>(new Vehicle("fiat")));
data.push_back(shared_ptr<Vehicle>(new Vehicle("bmw")));
data.push_back(shared_ptr<Vehicle>(new Vehicle("fiat")));
auto end = data.end();
for(auto i = data.begin(); i != end;)
{
if((*i)->getName() == "fiat")
{
auto ti = i;
++ti;
end = data.end(); //above erase, works but not logical
data.erase(i);
i=ti;
}
else
{
++i;
end = data.end();
}
}
하지만 작동하지 않습니까?
deque<shared_ptr<Vehicle>> data;
data.push_back(shared_ptr<Vehicle>(new Vehicle("porsche")));
data.push_back(shared_ptr<Vehicle>(new Vehicle("fiat")));
data.push_back(shared_ptr<Vehicle>(new Vehicle("fiat")));
data.push_back(shared_ptr<Vehicle>(new Vehicle("bmw")));
data.push_back(shared_ptr<Vehicle>(new Vehicle("fiat")));
auto end = data.end();
for(auto i = data.begin(); i != end;)
{
if((*i)->getName() == "fiat")
{
auto ti = i;
++ti;
data.erase(i);
end = data.end(); //Bellow erase...more logical but crashes
i=ti;
}
else
{
++i;
end = data.end();
}
}
일부 구현 수준의 문제가있는 것으로 생각됩니다. 아마도 컴파일러 버그 일 것입니다. GCC 사용하기 4.8.2.
코드에서 정의되지 않은 동작을 일으키는 버그가있을 가능성이 큽니다. 질문을 편집하고 [mcve]를 제공해야합니다. –
반복자 동작은 컨테이너 유형에 따라 다릅니다. 정확히 '데이터'는 무엇입니까? – 1201ProgramAlarm
코드가 추가되었습니다. 다른 장소에 오류가 없음을 보장합니다. 즉. Vehicle 클래스가 제대로 구현되었는지 등등. 코드를 집중시키고 깨끗하게 유지하기 위해 게시하지 않을 것입니다. – code