Здравствуйте, T4r4sB, Вы писали:
TB>Задание: напиши проверку (index >= 0 && index < size) для знакового типа так, чтоб оно скомпилировалось в один бранч
Здесь UB:
int32_t i = get_some_value();
uint64_t n = i; // (uint64_t)i; uint64_t(i)
TB>Вот я хочу перебрать элементы с конца
TB>TB>for (auto i = vec.size() - 1; i >=0; --i)
TB>
TB>Ну я вот записал цикл самым естественным образом. И подорвался на мине.
Чтобы не подорваться:
for (auto const& e : ranges::view::reverse(vec))
TB>А ещё я хочу перебрать все элементы, кроме последнего
ranges::subrange
https://en.cppreference.com/w/cpp/ranges/subrange
Для общих случаев используются встроенные адаптеры диапазонов:
https://en.cppreference.com/w/cpp/ranges#Range_adaptor_objects
или пишутся свои для "красоты" или удобства повторного их использования.
(обрати внимание на синтаксис адаптеров в примерах)
TB>Ой, что-то ерунда получается.
Есть такое, но это в прошлом же.
Сейчас хелперы навроде std::ssize(vec) служат для гладкого сопряжения с адаптерами из ranges:
https://en.cppreference.com/w/cpp/iterator/size
(для перехода в мир знаковых индексов)