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



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

有人能告诉我如何创建两个deque向量的联合视图吗。我已经试过这些方法了,但没有用。

#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;
}

这是一个现场演示。

一般来说,无论何时您想要Range-v3中的文档,您最好祈祷它也在C++20中,并参考它。join就是这样(但显然concat不是这样(。

你要找的是concat,而不是join:

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

join表示其他内容,即折叠两个嵌套范围:

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

请注意,join(在其他一些语言中也被称为join,如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}

Haskell的join真正做的是折叠两个嵌套的monad。为了在C++中提供参考,您可能想看看Boost。Hana,特别是Monad概念的文档。

最新更新