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

std::ranges::views 是 C++20 中 头文件提供的懒求值视图适配器集合,用于以函数式风格组合、转换和过滤范围(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> → 扁平 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
| views::filter(is_positive)
| views::transform(to_string)
| views::take(10);
该表达式不会产生中间容器,仅构建一个轻量 view 对象,迭代时才逐层调用逻辑。
注意边界与约束
不是所有 views 都适用于任意 range 类型:
立即学习“C++免费学习笔记(深入)”;
views::reverse 要求 range 是 bidirectional_range(如 std::vector、std::list),不适用于单向流(如 std::istringstream);views::join 要求内层 range 是 input_range,且所有内层 range 的 value_type 必须相同;views::common 可将非 common_range(如某些输入流)转为可存储的 range,便于赋值或传参;多数 views 返回的是 view 类型(即满足 std::ranges::view 概念),可直接用于 for-range 循环,但不可直接用 std::size() 获取大小(除非是 sized_range)。
实用小技巧
用 views::all 显式构造 view(尤其对 C 风格数组或临时 range):int arr[] = {1,2,3}; auto v = views::all(arr);用 views::iota 生成整数序列(类似 Python 的 range):auto seq = views::iota(1) | views::take(5); // 1,2,3,4,5避免多次迭代未缓存的 view(如基于输入流的 view),因为可能不可重放;必要时用 std::ranges::to()(C++23)或手动 materialize。
基本上就这些。掌握 filter / transform / take / drop / reverse / join 这几个,就能覆盖绝大多数日常数据流水线需求。组合灵活、零开销抽象,正是 ranges 的核心价值。
以上就是c++++中的std::ranges::views有哪些常用的_c++ C++20 Range库核心组件的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1489248.html
微信扫一扫
支付宝扫一扫