You are right to suspect that something is wrong. In order to avoid incrementing an invalidated iterator, you should write:
Code:
for (vector< vector<Point> >::iterator track = tracks_.begin(); track != tracks_.end();) {
if (track->empty()) {
track = tracks_.erase(track);
} else { //if there are points, deque
track->erase(track->begin());
++track;
}
}
However, if the track has exactly one point, then you will end up with empty tracks that are left in the vector. If that is undesirable, I suggest:
Code:
for (vector< vector<Point> >::iterator track = tracks_.begin(), end = tracks_.end(); track != end; ++track) {
if (!track->empty()) {
track->erase(track->begin());
}
}
tracks_.erase(std::remove(tracks_.begin(), tracks_.end(), vector<Point>()), tracks_.end());
// or use std::remove_if with a predicate that calls the empty member function.