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


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:

BlessAI BlessAI

Bless AI 提供五个独特的功能:每日问候、庆祝问候、祝福、祷告和名言的文本生成和图片生成。

BlessAI 135 查看详情 BlessAI
  • 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用法与视图详解【新特性】的详细内容,更多请关注其它相关文章!


# go  # access  # c++  # red  # 链式  # 迭代  # 新特性  # 遍历  # 重构  # 中文网  # python  # 的是  # 寿光抖音网站建设服务  # 网站排名优化推荐学生  # 合肥职业规划网站建设  # 辽宁网站设计优化方案  # 米业网站推广哪家好  # 滕州网站优化公司招聘  # 也不  # 几个  # 自定义  # 苏州建设国外网站  # 学校网站推广策  # 安阳网络推广网站大全  # 海口网站建设在哪办理 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  Animex动漫社正版在线入口 Animex动漫社动漫官方观看网  HTML与J*aScript实现下拉菜单驱动的动态表格:构建交互式维修表单  漫蛙漫画官方版直通入口 2025漫蛙漫画免注册访问说明  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  《咸鱼之王》新版孙坚技能解析  mysql如何回滚事务_mysql ROLLBACK事务回滚方法  win11自带录屏文件保存在哪里 Win11 Game Bar录制视频默认路径【分享】  苹果自助维修计划支持哪些设备机型  TikTok视频播放不流畅怎么办 TikTok视频播放优化方法  汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口  OpenWeatherMap API:通过城市名称获取天气预报数据指南  雨课堂官网在线登录 网页版雨课堂登录链接  Scipy Sparse CSR 矩阵非零元素行级遍历的最佳实践  iCloud官方网站 iCloud网页版在线登录入口  一加 Ace 6V 快充无法启用_一加 Ace 6V 充电优化  c++如何使用std::thread::join和detach_c++线程生命周期管理  《华夏千秋》龙女试炼功法获取方法  Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧  《红果免费短剧》下载观看方法  高效调试PHP大型嵌套数组:JSON序列化与可视化工具实践  Go语言中方法与接收器:指针和值类型的调用机制详解  PHP安全加载非公开目录图片与动态内容类型处理指南  微博网页版访问入口 微博网页版网页端使用指南  歌词怎么展示在|直播|间视频号?有什么注意事项?  WooCommerce 购物车:始终显示所有交叉销售商品  QQ邮箱注册地址 免费获取QQ邮箱账号  《东方财富》条件单关闭方法  漫蛙manwa官网浏览入口_漫蛙漫画网页版访问链接  以下哪一个是适应长期护理制度发展而设立的新职业  我的世界官方网址入口 我的世界游戏主页直达入口  智慧团建活动报名入口 智慧团建活动报名入口手机端官网​  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  《雷电模拟器》自动点击设置方法  PPT智能排版生成入口 免费PPT内容自动生成平台  J*aScript事件处理:优化键盘输入与表单提交的实践指南  QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务  Go语言反射机制下访问嵌入结构体中的被遮蔽方法  126邮箱申请入口官网_126邮箱注册免费登录2025  聚水潭ERP后台管理系统登录 聚水潭ERP官方登录通道  豆包AI怎样为教育场景定制答疑逻辑_为教育场景定制豆包AI答疑逻辑方案【方案】  研招网官方网站招生平台入口_中国研究生招生信息网官网登录  追剧达人如何发弹幕  解决CSS容器溢出问题:使用calc()实现精确布局与边距控制  苹果官网国补入口在哪  汽水音乐网页版登录 汽水音乐网页端官方入口  漫蛙manwa漫画官网链接_漫蛙manwa最新可用网址推荐  WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程  Fedora怎么安装 Fedora Workstation安装步骤  123网页端官方登录页 123邮箱网页版即时通讯服务 

 2025-12-13

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.