Недействительные границы цикла - PullRequest
1 голос
/ 10 августа 2010

Я недавно унаследовал проект, в основном выполненный на C ++, так что это мой первый реальный опыт работы с ним. Мне интересно, если у меня могут возникнуть проблемы с удалением элементов вектора из цикла, ограниченного векторами begin() и end().

Вот (по сути), что я пытался сделать:

for (vector<double>::iterator i = distance.begin(); i < distance.end(); i++) {
    for (vector<double>::iterator j = i + 1; j < distance.end(); j++) {

        /* code to assemble *i, *j, and some other values, say *x & *y 
        (also iterators) assumed to be in the distance vector */

        vector< vector<double >::iterator remove;
        remove.push_back(i); remove.push_back(j);
        remove.push_back(x); remove.push_back(y);

        sort(remove.begin(), remove.end());

        for (int r = remove.size() - 1; r >= 0; r--) {
            distance.erase(remove.at(r));
        }
    }
}

Для того, что я тестирую, похоже, это работает. Тем не менее, я обеспокоен, что это просто из-за случайности, и это решение не должно использоваться. distance.end() получает сброс в начале каждого цикла или C ++ просто проверяет начальное значение?

Ответы [ 2 ]

1 голос
/ 10 августа 2010

for-loop будет оценивать i < distance.end() в каждом цикле. Проблема в distance.erase, это сделает недействительным i, поэтому результат i++ не определен.

0 голосов
/ 10 августа 2010

distance.end() всегда точно соответствует текущему состоянию вектора.

for() циклы всегда переоценивают условие в каждом цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...