Страницы

Поиск по вопросам

среда, 10 октября 2018 г.

Обратный перебор вектора с size_t

Как мы знаем для перебора вектора / массива лучше использовать переменную типа 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];


Ответ

Для перебора вектора лучше использовать итератор. В случае работы задом наперед, подойдет реверсный итератор:
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, но нам это будет безразлично.
Замечу, что в случае такой работы с массивом перестанут работать некоторые оптимизации, например, векторизация или раскрутка цикла.

Комментариев нет:

Отправить комментарий