如何用C++23的zip_transform和repeat实现按最小值缩放输入范围?
关于C++23 zip_transform和repeat视图的语法正确性确认
你的scale_by_min函数在语法层面完全符合C++23标准中zip_transform和repeat视图的设计规范,具体说明如下:
- 核心语法符合标准设计
std::views::repeat(m)会生成一个无限重复值m的视图,而std::views::zip_transform的作用就是将多个输入视图的对应元素配对,传递给指定的可调用对象处理。由于你传入的原range是有限长度,zip_transform会自动以较短的视图(即原range)的长度作为输出视图的长度,完全满足需求。 - 参数与调用写法正确
函数参数使用auto&& range作为转发引用,能够兼容左值和右值类型的输入范围;std::ranges::min(range)的调用符合C++20及以后的ranges库用法(前提是输入范围的元素类型支持<比较运算符,且范围非空,题目已明确范围存在非零最小值,满足该前提)。
你的实现代码:
auto scale_by_min(auto&& range) { auto m = std::ranges::min(range); return std::views::zip_transform( range, std::views::repeat(m), [](auto x, auto min) { return x / min; } ); }
补充说明:你提到的C20替代写法(使用transform)确实更简洁,但这并不影响你用C23新视图实现的语法正确性——从C++23的标准提案设计来看,你的代码写法是完全合规的。
内容的提问来源于stack exchange,提问作者René Richter
相关产品推荐
相关产品推荐

