Лучший способ перебрать целое число
Поскольку в C++ 11 был введен цикл for, основанный на диапазоне (основан на диапазоне в C++ 11), каков наилучший способ выразить цикл в диапазоне целых чисел?
Вместо
for (int i=0; i<n; ++i)
Я хотел бы написать что-то вроде
for (int i : range(0,n))
Поддерживает ли новый стандарт что-либо подобное?
Обновление: эта статья описывает, как реализовать генератор диапазона в C++ 11: Генератор в C++
Ответы
Ответ 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
зависимости от случаев.