Страницы

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

суббота, 7 декабря 2019 г.

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

#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];

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

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