Многое: во-первых, вы не можете изменить (стереть / вставить) контейнер и ожидать, что итераторы останутся действительными!
Давайте посмотрим.Я также хочу изменить touchMove
:
void testApp::touchMoved(const ofTouchEventArgs & touch)
{
if (touch.id < touchPoints.size())
touchPoints[touch.id] = ofVec2f(touch.x, touch.y);
}
Далее, большое:
void testApp::touchUp(const ofTouchEventArgs & touch)
{
if (touch.id < touchPoints.size())
touchPoints.erase(touchPoints.begin() + touch.id);
}
В основном touch.id
это просто индекс ввектор, так что мы можем использовать это напрямую.Чтобы стереть элемент из середины, мы просто вызываем erase
на соответствующем итераторе.Так как вектор имеет итераторы произвольного доступа, мы можем сказать begin() + touch.id
в постоянное время.
Обновление: На самом деле я думаю, что ваш код не работает: после того, как вы удалите элемент из вектора, другойэлементы перемещаются вверх, поэтому вы потеряете связь между touch.id
и элементом контейнера!Вам нужно, как вы уже догадались, ассоциативный контейнер:
struct testApp
{
std::map<int, ofVec2f> touchPoints;
bool isTouching;
void touchDown(const ofTouchEventArgs & touch)
{
isTouching = true;
touchPoints[touch.id] = ofVec2f(touch.x, touch.y);
}
void touchMoved(const ofTouchEventArgs & touch)
{
touchPoints[touch.id] = ofVec2f(touch.x, touch.y);
}
void touchUp(const ofTouchEventArgs & touch)
{
isTouching = false;
touchPoints.erase(touch.id);
}
};