Предполагая, что размер списка не может быть даже кратным шагу, вы должны защититься от переполнения:
static constexpr auto step = 2;
// Guard against invalid initial iterator.
if (!list.empty())
{
for (auto it = list.begin(); /*nothing here*/; std::advance(it, step))
{
// do stuff...
// Guard against advance past end of iterator.
if (std::distance(it, list.end()) > step)
break;
}
}
В зависимости от реализации коллекции вычисление расстояния может быть очень медленным. Ниже это оптимально и более читабельно. Закрытие может быть изменено на шаблон утилиты с конечным значением списка, передаваемым константной ссылкой:
const auto advance = [&](list_type::iterator& it, size_t step)
{
for (size_t i = 0; it != list.end() && i < step; std::next(it), ++i);
};
static constexpr auto step = 2;
for (auto it = list.begin(); it != list.end(); advance(it, step))
{
// do stuff...
}
Если циклов нет:
static constexpr auto step = 2;
auto it = list.begin();
if (step <= list.size())
{
std::advance(it, step);
}