Вы вызываете неопределенное поведение. Все итераторы вектора становятся недействительными из-за того, что вы вызвали erase
для этого вектора. Для реализации вполне допустимо делать все, что захочет.
Когда вы звоните items.erase(it);
, it
теперь недействительно. Чтобы соответствовать стандарту, вы должны теперь предположить, что it
мертв.
Вы вызываете неопределенное поведение, используя этот недействительный итератор при следующем вызове vect.push_back
.
Вы снова вызываете неопределенное поведение, используя it
в качестве переменной отслеживания вашего for
цикла.
Вы можете сделать свой код действительным, используя std::remove_copy_if
.
class ItemIsAtPoint : std::unary_function<bool, item::Item>
{
Point pt;
public:
ItemIsAtPoint(const Point& inPt) : pt(inPt) {}
bool operator()(const item::Item* input)
{
return input->GetPosition() == pt;
}
};
void Level::getItemsAt(vector<item::Item>& vect, const Point& pt)
{
std::size_t oldSize = items.size();
std::remove_copy_if(items.begin(), items.end(), std::back_inserter(vect),
ItemIsAtPoint(pt));
items.resize(vect.size() - (items.size() - oldSize));
}
Вы можете сделать это намного красивее, если вы используете boost::bind
, но это работает.