range-v3 连接函数将两个容器连接在一起

And*_*rew 4 c++ range-v3 c++20

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

有人可以告诉我如何创建两个双端队列向量的联合视图。我已经尝试过这些方法,但无济于事。

#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;
}
Run Code Online (Sandbox Code Playgroud)

这是一个现场演示。

Enr*_*lis 7

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

您正在寻找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]
}
Run Code Online (Sandbox Code Playgroud)

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]
}
Run Code Online (Sandbox Code Playgroud)

请注意joinjoin在其他一些语言中也被调用,例如 Haskell 和flatten其他地方)是函数式编程中一个非常重要的概念。

事实上,当我写崩两个嵌套的范围,我是相当近似,因为Haskell的join(或真正意义join/ flatten/无论是所谓的范畴论)是比这更深刻。例如,在 Haskell 中确实是join (Just (Just 3)) == Just 3,在 C++ 中你会写成

std::optional<std::optional<int>>{3} | join /* not Range-v3's */ == std::optional<int>{3}
Run Code Online (Sandbox Code Playgroud)

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