Удаление во время итерации

Возможные дубликаты:
Vector.erase(Iterator) вызывает плохой доступ к памяти
итерация вектора, удаление некоторых элементов по ходу.

Привет, Я написал это, но при запуске я получаю некоторые ошибки.

for (vector< vector<Point> >::iterator track = tracks_.begin(); track != tracks_.end(); track++) {
        if (track->empty()) { // if track is empty, remove it
            tracks_.erase(track);
            track++; // is this ok?
        }else {   //if there are points, deque
            track->erase(track->begin()); //my program crashes here after a while... ;(
        }
    }

У меня есть вектор вектора точек (2 ints), который я называю треками (1 трек - 1 вектор точек) Я хочу проверить каждый трек, и если они содержат точки, то удалите первый, иначе удалите трек. Правильно ли это?

Спасибо заранее.

Ответ 1

Вектор erase() аннулирует существующие итераторы, но возвращает новый итератор, указывающий на элемент после того, который был удален. Этот возвращенный итератор может использоваться для продолжения итерации по вектору.

Ваша петля может быть написана так:

vector< vector<Point> >::iterator track = tracks_.begin();
while (track != tracks_.end()) {
    if (track->empty()) {
        // if track is empty, remove it
        track = tracks_.erase(track);
    }
    else {
        //if there are points, deque
        track->erase(track->begin());
        ++track;
    }
}

Ответ 2

Я не уверен, какие ошибки вы получаете, но есть вероятность, что вы аннулируете свой итератор.

Вы должны прочитать http://www.angelikalanger.com/Conferences/Slides/CppInvalidIterators-DevConnections-2002.pdf

В частности, vector::erase отменяет все итераторы и ссылки на элементы после позиции или сначала.