【问题标题】:ranges-v3 join function to join two containers togetherrange-v3 join 函数将两个容器连接在一起
【发布时间】:2021-09-11 09:54:48
【问题描述】:

我一直在尝试理解 Range-v3 join 文档,但老实说,我不明白。而且我也找不到任何相关的例子。

请有人告诉我如何创建两个双端队列向量的连接视图。我已经尝试了这些方法,但没有成功。

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

struct data_t
{
    int data;
    int some_other_data;
};

auto main() -> int
{
    using namespace ranges;

    auto v1 = std::deque<data_t>() = { {1,1}, {2,2}, {3,3}, {4,4}, {5,5} };
    auto v2 = std::deque<data_t>() = { {6,6}, {7,7}, {8,8}, {9,9}, {10,10} };

    auto vv = v1 | ranges::actions::join(v2);
    // auto vv = ranges::actions::join(v1, v2);   // Tried this too

    for(auto v : vv)
    {
        std::cout << v.data << ", " << std::endl;
    }

    return 0;
}

这是一个live 演示。

【问题讨论】:

    标签: c++ c++20 range-v3


    【解决方案1】:

    作为一般建议,每当您想要 Range-v3 中的某些内容的文档时,请祈祷它也是 C++20 中的,并参考该文档。 join 就是这种情况(但concat 显然不是)。

    您正在寻找concat,而不是join

    #include <range/v3/view/concat.hpp>
    #include <iostream>
    #include <vector>
    
    int main() {
        std::vector<int> v{1,2,3};
        std::vector<int> w{4,5,6};
        std::cout << ranges::views::concat(v,w) << std::endl; // prints [1,2,3,4,5,6]
    }
    

    join 用于其他用途,即折叠两个嵌套范围:

    #include <range/v3/view/join.hpp>
    #include <iostream>
    #include <vector>
    
    int main() {
        std::vector<std::vector<int>> w{{1,2,3},{4},{5,6}};
        std::cout << (w | ranges::views::join) << std::endl; // prints [1,2,3,4,5,6]
    }
    

    请注意,join(在其他一些语言中也称为 join,例如 Haskell,在其他地方称为 flatten)是函数式编程中非常重要的概念。

    确实,当我写折叠两个嵌套的范围时,我是相当近似的,因为Haskell's join(或join/@987654337的真正含义@/无论在范畴论中叫什么)比这要深刻得多。例如,在 Haskell 中,join (Just (Just 3)) == Just 3 是真的,在 C++ 中你可以写成

    std::optional<std::optional<int>>{3} | join /* not Range-v3's */ == std::optional<int>{3}
    

    Haskell 的 join 真正做的是折叠两个嵌套的 monads。对于 C++ 中的参考,您可能需要查看 Boost.Hana,特别是 Monad 概念的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      相关资源
      最近更新 更多