#cpp
Как мы знаем для перебора вектора / массива лучше использовать переменную типа size_t. Но когда нужно перебирать в обратном порядке возникает проблема. for (size_t i = size - 1; i >= 0; i--) cout << a[i]; Когда i дойдет до нуля, произойдет переполнение. Мой знакомый предложил простой способ решения проблемы. for (size_t i = size; i > 0; i--) cout << a[i - 1]; Но как-то некрасиво выходит, все-таки i - 1 а обращаемся к элементу i. Так вот вопрос, что лучше, использовать size_t как показано выше или использовать int? for (int i = (int)size - 1; i >= 0; i--) cout << a[i];
Ответы
Ответ 1
Для перебора вектора лучше использовать итератор. В случае работы задом наперед, подойдет реверсный итератор: for(auto i=a.rbegin();i!=a.rend();++i) { } Но если хочется использовать индекс - нет проблем: for(size_t i=a.size();i--;) { } Работает эта штука так - на каждой итерации она сначала проверяет, что i не ноль, после этого делает декремент и идет в тело цикла. В цикле получаются правильные индексы. После последней итерации, будет 0--, и i станет равна 2^( sizeof(size_t)*8 ) - 1, но нам это будет безразлично. Замечу, что в случае такой работы с массивом перестанут работать некоторые оптимизации, например, векторизация или раскрутка цикла.Ответ 2
Как ни странно: for (size_t i = size - 1; i != -1; i--) cout << a[i]; Если будет warning: for (size_t i = size - 1; i != size_t(-1); i--) cout << a[i];
Комментариев нет:
Отправить комментарий