由于C ++ 11引入了基于范围的for循环(range-based for in c++11),在一系列整数上表达循环的最佳方法是什么?
而不是
for (int i=0; i<n; ++i)
我想写点像
for (int i : range(0,n))
新标准是否支持此类内容?
更新:本文介绍如何在C ++ 11中实现范围生成器:Generator in C++
答案 0 :(得分:27)
虽然你无法使用纯C ++(使用当前的C ++标准库功能),但你可以在boost的帮助下完成它:
#include <boost/range/irange.hpp>
#include <iostream>
using namespace boost;
using namespace std;
int main(int argc, char **argv)
{
for(auto i : irange(1, 10))
cout << i << "\n";
return 0;
}
此外,Boost.Range
包含一些更有趣的范围,在使用新的for
循环时,您会发现这些范围非常有用。例如,使用Boost.Range,您可以进行反向for
循环。
答案 1 :(得分:18)
最好的方法仍然是:
for (int i=0; i<n; ++i)
我想你可以做到这一点,但我不会这么称呼:
#include <iostream>
int main()
{
for ( auto i : { 1,2,3,4,5 } )
{
std::cout<<i<<std::endl;
}
}
答案 2 :(得分:5)
使用C++20
,我们将获得范围。您可以通过从his github下载作者Eric Niebler的最新稳定版本来进行尝试,也可以转到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
是 lazy 。这意味着,即使views::iota
代表从1
到10
的范围,但从该范围开始最多只有一个int
。元素是按需生成的。
答案 3 :(得分:2)
根据您对整数的处理,特别考虑<numeric>
标题
std::iota
与std::transform
和std::fill
结合使用取决于具体情况。
答案 4 :(得分:1)
如果你不介意以相反的顺序循环,你可以替换
for (int i=0; i<n; ++i)
更简单
for (int i=n; i--;)