循环一系列整数的最好方法是什么?

use*_*674 35 c++

由于C++ 11引入了基于范围的for循环(基于范围的c ++ 11),在整数范围内表达循环的最佳方法是什么?

代替

for (int i=0; i<n; ++i)
Run Code Online (Sandbox Code Playgroud)

我想写点类似的东西

for (int i : range(0,n))
Run Code Online (Sandbox Code Playgroud)

新标准是否支持这种类型的任何东西?

更新:本文介绍如何在C++ 11中实现范围生成器:C++中的Generator

ixS*_*Sci 31

虽然你不能用纯C++(使用当前的C++标准库功能)来做到这一点,你可以在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";
}
Run Code Online (Sandbox Code Playgroud)

此外,还Boost.Range包含一些有趣的范围,您可以在使用新for循环时发现它们非常有用.例如,使用Boost.Range可以进行反向Boost.Range循环.


BЈо*_*вић 21

最好的方法仍然是:

for (int i=0; i<n; ++i)
Run Code Online (Sandbox Code Playgroud)

我想你可以做到这一点,但我不会这么称呼它:

#include <iostream>

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

  • 我将为第一句话给+1.有时旧的方式仍然是最好的:-) (9认同)
  • 这不是很整洁.它有三个(或两个,如果你想分裂头发)不同的命令式语句,你必须把它们放在一起,以实现它是一个循环.一点都不整齐.另外,它并不表示"i"是否重要,或者作者是否只想运行一段代码. (4认同)

Fur*_*ish 5

随着C++20我们将有范围。您可以通过从其作者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 << ' ';
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法的最大优点是views是惰性的。这意味着,即使views::iota代表从110排他的int范围,在某一点上也只有不超过该范围的一个。这些元素是按需生成的