首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >循环遍历一系列整数的最简洁方法

循环遍历一系列整数的最简洁方法
EN

Stack Overflow用户
提问于 2013-02-26 20:15:31
回答 6查看 36.4K关注 0票数 47

既然C++11引入了基于范围的for循环(range-based for in c++11),那么表示一系列整数上的循环的最简洁的方式是什么?

而不是

代码语言:javascript
复制
for (int i=0; i<n; ++i)

我想写这样的东西

代码语言:javascript
复制
for (int i : range(0,n))

新标准支持这类东西吗?

更新:本文描述如何在C++11:Generator in C++中实现范围生成器

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-02-26 20:36:09

虽然它不是由C++11提供的,但您可以编写自己的视图或使用boost中的视图:

代码语言:javascript
复制
#include <boost/range/irange.hpp>
#include <iostream>

int main(int argc, char **argv)
{
    for (auto i : boost::irange(1, 10))
        std::cout << i << "\n";
}

此外,结合新的for循环,Boost.Range包含一些更有趣的范围,您会发现这些范围非常有用。例如,您可以获得一个reversed view

票数 35
EN

Stack Overflow用户

发布于 2013-02-26 20:20:26

最简洁的方法仍然是:

代码语言:javascript
复制
for (int i=0; i<n; ++i)

我猜你可以做到这一点,但我不认为这是巧妙的:

代码语言:javascript
复制
#include <iostream>

int main()
{
  for ( auto i : { 1,2,3,4,5 } )
  {
    std::cout<<i<<std::endl;
  }
}
票数 30
EN

Stack Overflow用户

发布于 2019-08-30 04:51:35

有了C++20,我们就有了范围。你可以从它的作者Eric Niebler那里下载最新的稳定版本,从his github下载,或者访问Wandbox来尝试。您感兴趣的是ranges::views::iota,它使以下代码合法:

代码语言:javascript
复制
#include <range/v3/all.hpp>
#include <iostream>

int main() {
    using namespace ranges;

    for (int i : views::iota(1, 10)) {
        std::cout << i << ' ';
    }
}

这种方法的伟大之处在于view是懒惰的。这意味着,即使views::iota表示从110 exclusive的范围,但在某一点上,该范围中只有一个int存在。元素是按需生成的。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15088900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档