提问人:康桓瑋 提问时间:11/17/2023 最后编辑:康桓瑋 更新时间:11/17/2023 访问量:188
为什么“zip_view”不支持“output_range”?
Why does `zip_view` not support `output_range`?
问:
我注意到 C++23 的zip_view
有以下限制:
template<input_range... Views>
requires (view<Views> && ...) && (sizeof...(Views) > 0)
class zip_view;
这意味着只能压缩输入范围。zip_view
我想知道为什么它排除了 ,因为在我看来支持是有用的。例如,我可以压缩一堆 s 以同时写入,例如:output_range
output_range
output_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_range
output_range
iterator_concept
zip_view
range
由于我在原始论文 P2321 和 range/v3 中没有找到任何关于支持的讨论,我想知道为什么从一开始就不支持输出范围?这是一个不合理的选择吗?output_range
zip_view
答: 暂无答案
评论
ouput_range
input_iterator
zip
ranges::copy(input_range, output_range)
iota
fill
generate
zip_view
take_view
drop_view
common_view
input_or_output_iterator
zip
transform
*out++ = f(x);
f(*out++) = x;