为什么“zip_view”不支持“output_range”?

Why does `zip_view` not support `output_range`?

提问人:康桓瑋 提问时间:11/17/2023 最后编辑:康桓瑋 更新时间:11/17/2023 访问量:188

问:

我注意到 C++23 的zip_view有以下限制:

template<input_range... Views>
  requires (view<Views> && ...) && (sizeof...(Views) > 0)
class zip_view;

这意味着只能压缩输入范围。zip_view

我想知道为什么它排除了 ,因为在我看来支持是有用的。例如,我可以压缩一堆 s 以同时写入,例如:output_rangeoutput_rangeoutput_range

/* zipped input_range */
auto zip_in = views::zip(views::iota(0, 3),
                         views::iota(3, 6),
                         views::iota(6, 9));

std::vector<int> v1, v2, v3;
auto make_insert_range = [](auto inserter) {
  return ranges::subrange(inserter, std::unreachable_sentinel);
};
/* zipped output_range */
auto zip_out = views::zip(make_insert_range(std::back_inserter(v1)),
                          make_insert_range(std::back_inserter(v2)),
                          make_insert_range(std::back_inserter(v3)));

/* copy */
ranges::copy(zip_in, zip_out.begin());
std::println("v1: {}", v1); // v1: [0, 1, 2]
std::println("v2: {}", v2); // v2: [3, 4, 5]
std::println("v3: {}", v3); // v3: [6, 7, 8]

尽管当前被编译器拒绝,因为不满足约束。zip_out

我认为这样做在技术上是可行的。尽管这可能会带来一些棘手的问题,例如,如果一个 zip 同时,它的迭代器会是什么类别?我认为我们不能提供,让input_input_rangeoutput_rangeiterator_conceptzip_viewrange

由于我在原始论文 P2321 和 range/v3 中没有找到任何关于支持的讨论,我想知道为什么从一开始就不支持输出范围?这是一个不合理的选择吗?output_rangezip_view

C++ 标准范围 C++23

评论

0赞 Red.Wave 11/17/2023
标记 language-lawyer
0赞 Red.Wave 11/17/2023
结果类别是所有类别中限制性最强的,如果存在,那将是,否则如果存在......ouput_rangeinput_iterator
0赞 Barry 11/18/2023
没有输入范围适配器支持输出范围,为什么应该有所不同?我们甚至几乎没有采用输出范围的算法 - 我们没有 , 我们只有 、 和 。zipranges::copy(input_range, output_range)iotafillgenerate
0赞 康桓瑋 11/18/2023
@Barry我的意思是,为什么首先是输入范围适配器,而不是支持输出范围的更通用的范围适配器,例如 和 ?是什么阻止了zip_iterator包装?zip_viewtake_viewdrop_viewcommon_viewinput_or_output_iterator
0赞 Barry 11/18/2023
@康桓瑋我想也许可以在没有任何其他约束更改的情况下工作,但调整输出范围只是调整输入范围的根本不同操作。你想要的输出范围会想要......不ziptransform*out++ = f(x);f(*out++) = x;

答: 暂无答案