Есть ли эквивалент boost::irange в C++20?

С объединением диапазонов в C++20 я надеялся, что мы получим эквивалент boost::irange в C++, но поиск в Google ничего не нашел...

Я знаю о std::views::iota, но это не то же самое, в частности, перегрузка с одним аргументом начинается, а не заканчивается.


person NoSenseEtAl    schedule 05.09.2019    source источник
comment
Разве не легко написать утилиту, которая принимает верхнюю границу и возвращает правильно инициализированное std::views::iota?   -  person StoryTeller - Unslander Monica    schedule 05.09.2019
comment
для будущих читателей: это не дубликат: я прошу конкретную замену С++ 20 для boost: irange, а не самый аккуратный способ перебрать диапазон целых чисел   -  person NoSenseEtAl    schedule 06.09.2019
comment
Стоит отметить, что объем кода, который извлекает библиотека диапазонов, весьма значителен, и это, вероятно, также относится к ускорению, поэтому есть еще что сказать о более простых, сделанных на заказ irange реализациях.   -  person einpoklum    schedule 01.06.2021


Ответы (2)


Есть ли эквивалент boost::irange в С++ 20?

Не напрямую, но легко предоставить собственную эквивалентную функцию полезности.

template<std::semiregular Bound>
auto irange(Bound b)
{
     return std::ranges::iota_view(0, b);
}
person lubgr    schedule 05.09.2019

irange с одним аргументом можно легко реализовать с помощью views::iota:

template <std::integral I>
auto irange(I end) {
    return std::views::iota(I{0}, end);
}

Обратите внимание, что irange предназначен только для целых чисел, а iota требует, чтобы его аргументы имели одинаковую подписанность, поэтому мы используем I{0} вместо простого 0 для обработки беззнаковых типов.

Но для полного завершения irange нам нужен другой адаптер диапазона, которого нет в C++20: views::stride. Вы можете получить его от range-v3. А затем запишите их как объект для дальнейшего удобства:

struct irange_t {
    template <std::integral I>
    constexpr auto operator()(I end) const {
        return std::views::iota(I{0}, end);
    }

    template <std::integral I>
    constexpr auto operator()(I begin, I end) const {
        return std::views::iota(begin, end);
    }

    template <std::integral I, std::integral S>
    constexpr auto operator()(I begin, I end, S step) const {
        return std::views::iota(begin, end) | ranges::views::stride(step);
    }
};

inline constexpr irange_t irange{};
person Barry    schedule 05.09.2019
comment
В range-v3 IIRC есть специальное представление под названием ints. - person L. F.; 12.09.2019