无法在范围-v3中调用斐波纳契序列的反向

时间:2017-03-19 13:02:06

标签: c++ range-v3

我似乎无法使view::reverse对使用view::take(10)&#39生成的斐波纳契序列v的前10个元素(使用range-v3)进行操作; s view::generate

#include <iostream>
#include <range/v3/view/iota.hpp>
#include <range/v3/view/generate.hpp>
#include <range/v3/view/take.hpp>
#include <range/v3/view/reverse.hpp>

using namespace ranges;

int main() {
    int i = 0 ; int j = 1;
    auto v = view::generate([&]()->int{int tmp = i; i += j; std::swap(i, j); return tmp;}); // fibonacci
    std::cout << (v | view::take(10) | view::reverse) << '\n';
    return 0;
}

我收到以下错误(后跟更多与模板相关的输出):

error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'void')
     std::cout << (v | view::take(10) | view::reverse) << '\n';

但是,如果我使用view::iota创建v,例如

 auto v = view::iota(20);

我没有得到任何错误和预期的输出。

出了什么问题?

1 个答案:

答案 0 :(得分:3)

view::generate生成了一个输入范围。您无法反转输入范围。这需要双向。另一方面,view::iota产生RandomAccess范围,可以反转。