新闻中心

c++20 Ranges库入门教程_c++ std::ranges用法与视图详解【新特性】

2025-12-13
浏览次数:
返回列表
std::ranges是C++20对标准算法的现代化重设计,提供范围重载、惰性视图和概念约束;支持直接传容器、链式视图组合(如filter|transform)、零拷贝计算,并要求C++20编译支持。

c++20 ranges库入门教程_c++ std::ranges用法与视图详解【新特性】

std::ranges 是 C++20 引入的核心新特性之一,它把算法、迭代器和容器的交互方式彻底重构为更安全、更组合化、更易读的形式。它不是“另一个算法库”,而是对 <algorithm></algorithm> 的现代化重设计——所有标准算法现在都有了范围(range)重载,支持直接传入容器或视图,无需手动写 begin()/end();同时引入了惰性求值的 views(视图),可链式组合、零拷贝、不产生中间容器。

ranges 算法:告别 begin/end,直接操作容器

传统写法要显式传入迭代器对:

std::vector<int> v = {1, 2, 3, 4, 5};
std::sort(v.begin(), v.end(), std::greater{});

ranges 版本直接传容器或任意 range:

std::ranges::sort(v, std::greater{}); // ✅ 自动推导 begin/end
std::ranges::reverse(v);               // ✅ 更简洁
std::ranges::find(v, 3);             // 返回的是 iterator,但类型更精确(sized_iterator 等)

关键点:

  • 所有 std::algorithm 中的算法在 std::ranges 命名空间下都有对应重载;
  • 支持任何满足 range 概念的对象(包括数组、vector、string、initializer_list,甚至 C 风格字符串指针 + 长度);
  • 多数算法返回 std::ranges::subrange 或更语义化的迭代器类型,配合结构化绑定更清晰;
  • 部分算法有“稳定”、“投影”等增强重载,比如 std::ranges::sort(v, {}, &Person::age)

views:惰性、可组合、零分配的视图管道

views 不是容器,也不保存数据,只是“描述如何查看数据”的轻量对象。创建开销极小,组合时不做实际计算,直到你遍历它。

最常用的方式是用管道操作符 | 链式调用:

auto even_squares = v 
  | std::views::filter([](int x) { return x % 2 == 0; })
  | std::views::transform([](int x) { return x * x; });
// 此时 nothing is computed
for (int x : even_squares) { /* 4, 16 */ } // ✅ 此时才逐个计算

常用内置 views:

Mistral AI Mistral AI

Mistral AI被称为“欧洲版的OpenAI”,也是目前欧洲最强的 LLM 大模型平台

Mistral AI 182 查看详情 Mistral AI
  • std::views::filter(pred):筛选满足条件的元素;
  • std::views::transform(fn):对每个元素做映射;
  • std::views::take(n) / std::views::drop(n):取前 n 个 / 跳过前 n 个;
  • std::views::join:展平嵌套 range(如 vector>);
  • std::views::iota(start, end):生成整数序列(类似 Python 的 range);
  • std::views::keys / std::views::values:提取 map 的键或值。

注意:views 是 const-friendly 且可复制的;多次遍历同一 view 可能触发重复计算(除非底层 range 支持随机访问且 view 是纯函数式)。

range 概念与自定义 range 入门

C++20 用 concept 精确定义了什么是 range:

  • std::ranges::range<t></t>:T 有 begin()end(),返回兼容的迭代器;
  • std::ranges::view<t></t>:range + 移动代价为 O(1)(即轻量);
  • std::ranges::sized_range<t></t>:支持 size() 且为 O(1);
  • std::ranges::random_access_range<t></t>:支持 operator[] 和随机跳转。

你可以轻松让自定义类型支持 ranges:

struct IntRange {
  int from_, to_;
  struct iter {
    int val;
    int operator*() const { return val; }
    iter& operator++() { ++val; return *this; }
    bool operator!=(const iter& other) const { return val != other.val; }
  };
  iter begin() const { return {from_}; }
  iter end() const { return {to_}; }
};
// 现在可以直接用:for (int x : IntRange{0, 3}) { ... }
// 也能参与 views:IntRange{0,10} | views::filter(...);

实用建议与避坑提示

刚上手容易踩的几个点:

  • 别混用老式迭代器和 ranges 算法:例如 std::ranges::sort(it1, it2) 是错的,必须传 range;
  • views 默认不可存储(尤其 lambda 捕获):若需保存,用 auto 或显式模板(std::ranges::filter_view 等);
  • 某些 views(如 filter)不满足 sized_range,调 size() 会编译失败;
  • 调试时无法直接打印 view —— 它不是容器,需转成 vector 或用 range-for 查看;
  • 编译需开启 C++20(-std=c++20),GCC 10+/Clang 13+/MSVC 19.30+ 支持较完整。

基本上就这些。ranges 不是炫技,而是让 C++ 容器操作回归“所见即所得”:写得像描述逻辑,运行得像手工优化。从今天起,少写 begin/end,多用 | 管道,你会慢慢觉得以前的写法有点笨重。

以上就是c++++20 Ranges库入门教程_c++ std::ranges用法与视图详解【新特性】的详细内容,更多请关注其它相关文章!


# 自定义  # 营销型网站建设题库答案  # 甘孜优化网站的公司  # 阳江网站建设推广方法  # 海外网站推广是什么行业  # 福田独立网站优化如何做  # 网站建设怎么咨询  # 镇江网站建设外包公司  # 蒲城网站推广方案  # 速卖通网红营销推广案例  # 江苏seo服务案例公司  # 几个  # 的是  # python  # 中文网  # 欧洲  # 重构  # 遍历  # 新特性  # 迭代  # 链式  # red  # c++  # access  # go 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  离线运行Go语言之旅:本地部署与GOPATH配置指南  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  Django表单提交验证失败后保持字段值不刷新  J*aScriptWebpack优化_J*aScript构建工具实战  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  C++如何实现单例模式_C++设计模式之线程安全的单例写法  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  AO3网页版最新入口合集 Archive of Our Own在线访问指南  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  j*a toString()的覆盖  俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问  Golang如何使用context实现超时取消_Golang context超时取消模式实践  C++如何解决segmentation fault_C++段错误调试与原因分析  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  SteamMachine定价或为699美元 大家想入手吗?  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  必由学官方平台入口 必由学在线课堂登录地址  实现全屏滚动与导航点:专业教程  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  J*aScript中localStorage数据的获取、清洗与格式化教程  必由学官网快捷入口 必由学网页版在线学习平台  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  服务端验证_j*ascript输入检查  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  12306选座怎么选到临时改签座_12306改签选座策略与步骤  千牛数据看板网页版_千牛数据看板网页版访问方法  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  微信网页版登录教程_微信网页版登录入口在哪  自定义Bag-of-Words实现:处理带负号的词汇权重  Flexbox布局实践:实现粘性导航栏与底部固定页脚  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  Go语言JSON解析深度指南:动态访问与结构体映射实践  使用Python高效删除Word宏并转换DOCM为DOCX格式  CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题  微信网页版扫码登录入口 微信网页版二维码登录入口  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  AO3官方在线访问地址 Archive of Our Own最新镜像合集  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  汽水音乐在线解析 汽水音乐在线解析入口 

搜索