其他分享
首页 > 其他分享> > c – 范围v3使序列变平

c – 范围v3使序列变平

作者:互联网

所以我最近在c上看了这个演讲:
https://www.youtube.com/watch?v=mFUXNMfaciE

我对尝试它非常感兴趣.因此,在一些玩具程序之后,我被困在如何正确地将矢量矢量平面化为矢量.根据这里的文档:https://ericniebler.github.io/range-v3/这可以使用range :: view :: for_each.但是我似乎无法让它发挥作用.这是一些最小的代码.

#include <range/v3/all.hpp>
#include <iostream>
#include <vector>

int main()
{
    auto nums = std::vector<std::vector<int>>{
        {0, 1, 2, 3},
        {5, 6, 7, 8},
        {10, 20},
        {30},
        {55}
    };

    auto filtered = nums
        | ranges::view::for_each([](std::vector<int> num) { return ranges::yield_from(num); })
        | ranges::view::remove_if([](int i) { return i % 2 == 1; })
        | ranges::view::transform([](int i) { return std::to_string(i); });

    for (const auto i : filtered)
    {
        std::cout << i << std::endl;
    }
}

解决方法:

range-v3错误消息往往非常可怕,所以这个实际上比大多数更好:

prog.cc: In lambda function:
prog.cc:16:90: error: no match for call to '(const ranges::v3::yield_from_fn) (std::vector<int>&)'
         | ranges::view::for_each([](std::vector<int> num) { return ranges::yield_from(num); })
                                                                                          ^
In file included from /opt/wandbox/range-v3/include/range/v3/view.hpp:38:0,
                 from /opt/wandbox/range-v3/include/range/v3/all.hpp:21,
                 from prog.cc:1:
/opt/wandbox/range-v3/include/range/v3/view/for_each.hpp:133:17: note: candidate: template<class Rng, int _concept_requires_132, typename std::enable_if<((_concept_requires_132 == 43) || ranges::v3::concepts::models<ranges::v3::concepts::View, T>()), int>::type <anonymous> > Rng ranges::v3::yield_from_fn::operator()(Rng) const
             Rng operator()(Rng rng) const
                 ^~~~~~~~

对于那些对range-v3的概念仿真层有一定了解的人来说,这个“清楚地”表明对yield_from的调用失败了,因为你传递给它的参数的类型 – std :: vector< int> – 不满足View概念.

View概念表征不拥有其元素的范围的子集,因此具有所有操作 – 移动/复制构造/赋值,开始,结束和默认构造 – 可在O(1)中计算.范围-v3中的范围组合algrebra仅适用于视图,以避免必须处理元素生命周期并提供可预测的性能.

yield_from拒绝你试图传递的std :: vectors,因为它们不是视图,但是你可以通过(1)将向量作为左值而不是for_each中的值来轻松提供视图,以及(2)产生视图::所有那些左值[DEMO]:

auto filtered = nums
    | ranges::view::for_each([](std::vector<int>& num) {
        return ranges::yield_from(ranges::view::all(num)); })
    | ranges::view::remove_if([](int i) { return i % 2 == 1; })
    | ranges::view::transform([](int i) { return std::to_string(i); });

但是在这个简单的例子中,将一系列元素范围扁平化为一系列元素已经在range-v3:view :: join中具有特定于目的的视图.您也可以使用[DEMO]:

auto filtered = nums
    | ranges::view::join
    | ranges::view::remove_if([](int i) { return i % 2 == 1; })
    | ranges::view::transform([](int i) { return std::to_string(i); });

标签:stl-algorithm,c,iterator,range-v3
来源: https://codeday.me/bug/20190828/1752572.html