如何在C++中创建无限序列

AK_*_*AK_ 6 c++ boost c++11

我正在使用Visual Studio 2012,所以C++ 11基本上没问题......提升也很好,但我宁愿避免其他的libreries,至少不是widley使用过的.

我想以最优雅的方式创建一个只返回无限序列的前向迭代器.例如,所有自然数的序列.

基本上我想要这个f#代码的C++等效:

let nums =
    seq { while true do
            yield 1
            yield 2
        }
Run Code Online (Sandbox Code Playgroud)

上面的代码基本上创建了一个返回[1; 2; 1; 2 ...]的枚举器

我知道我可以通过写一个课来做到这一点,但是所有新的lambdas和所有......都必须有一个更短的方式......

Kir*_*rov 5

这是你想要的吗:

#include <iostream>
#include <vector>

int main() 
{
    auto nums = []
    {
        static unsigned x = 2;
        return ( x++ % 2 ) + 1;
    };

    std::vector< int > v{ nums(), nums(), nums(), nums(), nums() };
    for( auto i : v )
    {
        std::cout << i;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

或者我误解了这个问题?


Ger*_*ago 5

如果你可以依赖 boost 的话,更简单的事情就是写这样的东西:

int i = 0;
auto gen = boost::make_generator_iterator([=]() mutable { return i++; });
Run Code Online (Sandbox Code Playgroud)

C++14版本:

auto gen = boost::make_generator_iterator([i=0]() mutable { return i++;});
Run Code Online (Sandbox Code Playgroud)

文档在这里

PS:我不确定它是否可以在没有result_type成员的情况下工作,而 C++03 函子需要成员。