Подтвердить что ты не робот

Лучший способ перебрать целое число

Поскольку в C++ 11 был введен цикл for, основанный на диапазоне (основан на диапазоне в C++ 11), каков наилучший способ выразить цикл в диапазоне целых чисел?

Вместо

for (int i=0; i<n; ++i)

Я хотел бы написать что-то вроде

for (int i : range(0,n))

Поддерживает ли новый стандарт что-либо подобное?

Обновление: эта статья описывает, как реализовать генератор диапазона в C++ 11: Генератор в C++

4b9b3361

Ответ 1

Хотя это не предусмотрено в С++ 11, вы можете написать собственное представление или использовать его из boost:

#include <boost/range/irange.hpp>
#include <iostream>

int main(int argc, char **argv)
{
    for (auto i : boost::irange(1, 10))
        std::cout << i << "\n";
}

Более того, Boost.Range содержит еще несколько интересных диапазонов, которые вы можете найти довольно полезными в сочетании с новым циклом for. Например, вы можете получить перевернутый вид.

Ответ 2

Лучший способ до сих пор это:

for (int i=0; i<n; ++i)

Я думаю, вы можете сделать это, но я бы не назвал это так аккуратно:

#include <iostream>

int main()
{
  for ( auto i : { 1,2,3,4,5 } )
  {
    std::cout<<i<<std::endl;
  }
}

Ответ 3

С C++20 у нас будут диапазоны. Вы можете попробовать их, загрузив последний стабильный выпуск от его автора Эрика Ниблера из его github, или перейдите на Wandbox. То, что вас интересует, это ranges::views::iota, что делает этот код легальным:

#include <range/v3/all.hpp>
#include <iostream>

int main() {
    using namespace ranges;

    for (int i : views::iota(1, 10)) {
        std::cout << i << ' ';
    }
}

Что хорошего в этом подходе, так это то, что view ленивы. Это означает, что, хотя views::iota представляет диапазон от 1 до 10 эксклюзивно, в одной точке существует не более одного int из этого диапазона. Элементы генерируются по запросу.

Ответ 4

В зависимости от того, что вы должны делать с целым числом, рассмотрите также заголовок <numeric>, в частности std::iota в сочетании с std::transform и std::fill зависимости от случаев.