Neatest way to loop over a range of integers
Since C++11 introduced the range-based for loop (range-based for in c++11), what is the neatest way to express looping over a range of integers?
Instead of
for (int i=0; i<n; ++i)
I'd like to write something like
for (int i : range(0,n))
Does the new standard support anything of that kind?
Update: this article describes how to implement a range generator in C++11: Generator in C++
Solution 1:
While its not provided by C++11, you can write your own view or use the one from 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";
}
Moreover, Boost.Range
contains a few more interesting ranges which you could find pretty useful combined with the new for
loop. For example, you can get a reversed view.
Solution 2:
The neatest way is still this:
for (int i=0; i<n; ++i)
I guess you can do this, but I wouldn't call it so neat:
#include <iostream>
int main()
{
for ( auto i : { 1,2,3,4,5 } )
{
std::cout<<i<<std::endl;
}
}
Solution 3:
With C++20
we will have ranges. You can try them by downloading the lastest stable release from it's author, Eric Niebler, from his github, or go to Wandbox. What you are interested in is ranges::views::iota
, which makes this code legal:
#include <range/v3/all.hpp>
#include <iostream>
int main() {
using namespace ranges;
for (int i : views::iota(1, 10)) {
std::cout << i << ' ';
}
}
What's great about this approach is that view
s are lazy. That means even though views::iota
represents a range from 1
to 10
exclusive, no more than one int
from that range exists at one point. The elements are generated on demand.