std::ranges::views 是 C++20 提供的懒求值视图适配器集合,支持 filter、transform、take、drop、reverse、join 等操作,通过 | 管道链式组合,不拷贝数据、延迟计算,满足高效函数式数据处理需求。

std::ranges::views 是 C++20 中 <ranges></ranges> 头文件提供的懒求值视图适配器集合,用于以函数式风格组合、转换和过滤范围(ranges),不拷贝数据、不立即执行,只在迭代时按需计算。
常用 views 及典型用途
以下是最常被使用的 views,覆盖过滤、变换、截取、拼接等核心场景:
-
views::filter:按谓词筛选元素。
例:auto evens = nums | views::filter([](int x) { return x % 2 == 0; }); -
views::transform:对每个元素应用一元函数。
例:auto squares = nums | views::transform([](int x) { return x * x; }); -
views::take 和 views::drop:取前 N 个或跳过前 N 个。
例:auto first5 = data | views::take(5);,auto rest = data | views::drop(3); -
views::take_while 和 views::drop_while:按条件动态截取。
例:auto pos = nums | views::take_while([](int x) { return x > 0; }); -
views::reverse:反转遍历顺序(要求底层 range 支持双向迭代)。
例:auto reversed = vec | views::reverse; -
views::join:展平嵌套范围(如
vector<vector>></vector>→ 扁平 int 序列)。
需配合views::transform使用:outer | views::transform([](const auto& v) { return v; }) | views::join; -
views::zip(C++23 引入,部分标准库已提前支持):并行遍历多个 range,生成 tuple 序列。若仅用 C++20,可用
views::zip_transform替代(需自行实现或借助第三方如 range-v3)。
组合与管道语法(| 操作符)
所有 views 支持链式组合,用 | 连接,从左到右执行,语义清晰且高效:
auto result = data<br> | views::filter(is_positive)<br> | views::transform(to_string)<br> | views::take(10);
登录后复制
该表达式不会产生中间容器,仅构建一个轻量 view 对象,迭代时才逐层调用逻辑。
注意边界与约束
不是所有 views 都适用于任意 range 类型:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~