Neatest way to loop over a range of integers
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;
}
}
With C++20
we will have ranges. If you don't have access to C++20, 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.
If you do have access to C++20, this version works out of the box:
#include <ranges>
#include <iostream>
int main() {
for (int i : std::views::iota(1, 10)) {
std::cout << i << ' ';
}
}
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.