Реверс для цикла вызывает системные ошибки - PullRequest
0 голосов
/ 20 марта 2012

Это похоже на проблему новичка, но я не могу понять это. Я хочу перебрать элементы в std :: vector. В настоящее время я использую этот цикл:

for (unsigned int i = 0; i < buffer.size(); i++) {
    myclass* var = buffer.at(i);
    [...]
}

Однако я понял, что на самом деле хочу перебирать его в обратном порядке: начиная с конца и работая до 0. Поэтому я попытался использовать этот итератор:

for (unsigned int i = buffer.size()-1; i >= 0; i--) {
    myclass* var = buffer.at(i);
    [...]
}

Но, просто заменив старую строку новой (и, конечно же, перекомпилировав), он перестанет работать должным образом и выполнять итерации по коду, вместо этого программа будет аварийно завершать работу при первом обращении к этой строке, ошибка:

http://i43.tinypic.com/20sinlw.png

Вслед за диалоговым окном «[Программа] перестала работать».

Программа также возвращает код выхода 3, в соответствии с Code :: Blocks, который (если эта статья должна считаться верной) означает ERROR_PATH_NOT_FOUND: система не может найти указанный файл.

Любой совет? Я просто что-то пропускаю в цикле for, что может вызвать проблемы с памятью? Код возврата 3 или статья вводят в заблуждение, и на самом деле это не означает «путь не найден»?

Ответы [ 3 ]

3 голосов
/ 20 марта 2012

Целое число без знака всегда> = 0. Кроме того, уменьшение от 0 переходит к большому числу.

2 голосов
/ 20 марта 2012

Когда i == 0 (то есть, какой должна быть последняя итерация), при уменьшении i-- i оборачивается до максимально возможного значения для unsigned int. Таким образом, условие i >= 0 все еще выполняется, даже если вы хотите, чтобы цикл остановился.

Чтобы исправить это, вы можете попробовать что-то вроде этого, которое поддерживает оригинальную логику цикла, но дает убывающее i:

unsigned int i;
unsigned int size = buffer.size();
for (unsigned int j = 0; j < size; j++) {
    i = size - j - 1;

В качестве альтернативы, поскольку std::vector имеет определенные методы rbegin и rend, вы можете использовать итераторы:

for(typename std::vector<myclass *>::reverse_iterator i = buffer.rbegin(); i != rend(); ++i)
{
    myclass* var = *i;
    // ...
}

(могут быть небольшие синтаксические ошибки - у меня нет под рукой компилятора)

0 голосов
/ 20 марта 2012
#include <vector>

using namespace std;

int main() {
    vector<int> buffer = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    for (vector<int>::reverse_iterator it = buffer.rbegin(); it != buffer.rend(); it++) {
        //do your stuff
    }
    return 0;
}
...