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

时间:2013-02-26 12:15:31

标签: c++ c++11

由于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++

5 个答案:

答案 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代表从110的范围,但从该范围开始最多只有一个int。元素是按需生成的

答案 3 :(得分:2)

根据您对整数的处理,特别考虑<numeric>标题 std::iotastd::transformstd::fill结合使用取决于具体情况。

答案 4 :(得分:1)

如果你不介意以相反的顺序循环,你可以替换

for (int i=0; i<n; ++i)

更简单

for (int i=n; i--;)