c++中的std::ranges::views有哪些常用的_c++ C++20 Range库核心组件

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

c++中的std::ranges::views有哪些常用的_c++ C++20 Range库核心组件-第1张图片-佛山资讯网

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::takeviews::drop:取前 N 个或跳过前 N 个。
    例:auto first5 = data | views::take(5);auto rest = data | views::drop(3);
  • views::take_whileviews::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 类型:

标签: python c++ stream 标准库

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~

趣科技 机圈观察员 茄考网 茄录网 海印网 雷鹃网 鹃朝网 互联网观察员 评测官
趣科技 机圈观察员 茄考网 茄录网 海印网 雷鹃网 鹃朝网 互联网观察员 评测官