全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++20的范围库(Ranges)是什么 彻底改变你的for循环和算法使用【详解】

C++20范围库是底层抽象范式升级,以range统一容器、迭代器与算法,支持惰性求值、组合式视图(如filter/transform)和简化for循环及算法调用。

C++20 的范围库(Ranges)不是“增强版 STL”,而是一次底层抽象范式的升级:它把“容器 + 迭代器 + 算法”三件套,统一成更自然、更组合化、更惰性求值的 范围(range) 概念。你不再需要手动传 begin()/end(),也不必担心迭代器失效或类型不匹配——for 循环和标准算法从此变得更像 Python 的 for item in list 或 Rust 的 iter().filter().map()。

什么是 range?不只是容器的别名

一个 range 是任何能通过 begin()end() 获得一对迭代器的对象(比如 vector、array、string),但关键在于:C++20 把这个概念正式纳入标准,并提供了统一接口和配套工具。它不等于容器,而是更高一层的抽象——比如子串视图(std::views::subrange)、过滤后视图(std::views::filter)、转换后视图(std::views::transform)都是 range,但它们本身不拥有数据,也不立即计算结果。

  • range 可以是 owning(如 vector)或 view(轻量、无拥有权、惰性)
  • view 是 range 的子集,要求常数时间构造/拷贝/移动,且不持有元素副本
  • 所有标准算法(如 sort、find、count)现在都有 range 版本(如 std::ranges::sort),直接接受 range,无需迭代器对

告别 begin/end:for 循环彻底简化

以前写循环要记住配对、类型一致、避免越界;现在只要对象是 range,就能直接用基于范围的 for:

std::vector v = {1, 2, 3, 4, 5};
// 传统写法(冗余且易错)
for (auto it = v.begin(); it != v.end(); ++it) { /* ... */ }

// C++20 写法(干净、安全、可读) for (int x : v) { / 直接用元素 / }

// 更进一步:直接遍历处理后的逻辑视图 for (int x : v | std::views::filter([](int n){ return n % 2 == 0; }) | std::views::transform([](int n){ return n * n; })) { std::cout << x << ' '; // 输出 4 16(偶数的平方) }

注意:| 是管道操作符(由 operator| 重载支持),让视图组合像 Unix 命令一样直观。整个链式表达式仍是 view,不会分配新容器,也不会立刻执行——直到你遍历它。

算法变“懒”了:std::ranges::xxx vs std::xxx

C++20 提供两套并行算法:老式 std::xxx(仍可用)和新式 std::ranges::xxx。后者有三大变化:

  • 参数变简单:直接接收 range,自动提取 begin/end
  • 约束更严格:编译期检查 range 是否满足算法要求(如 sort 要求 random_access_range + sortable)
  • 返回类型更合理:例如 std::ranges::find 返回 iterator,而 std::ranges::find_if 也一样,不再有“返回 bool + out-param”的混乱设计

示例对比:

// C++17 及之前
auto it = std::find(v.begin(), v.end(), 42);
if (it != v.end()) { /* found */ }

// C++20 if (auto res = std::ranges::find(v, 42); res != v.end()) { / found / } // 或更惯用: if (std::ranges::find(v, 42) != v.end()) { ... }

常用 views 实战:filter、transform、take、drop、join

标准库提供了一组开箱即用的 view 适配器(定义在 中),它们是构建数据流水线的核心积木:

  • std::views::filter(pred):只保留满足谓词的元素(惰性,不复制)
  • std::views::transform(fn):对每个元素应用函数,生成新 view(不执行,仅描述)
  • std::views::take(n):取前 n 个;std::views::drop(n):跳过前 n 个
  • std::views::join:把 range of ranges(如 vector>)展平为单层 range
  • std::views::iota(start, end):生成 [start, end) 区间整数序列(类似 Python 的 range())

组合示例:

auto nums = std::views::iota(1, 100)
          | std::views::filter([](int x){ return x % 3 == 0 || x % 5 == 0; })
          | std::views::take(10);

for (int x : nums) { std::cout << x << ' '; // 输出前 10 个 3 或 5 的倍数:3 5 6 9 10 12 15 18 20 21 }

这段代码没有创建任何中间 vector,全程零堆分配,语义清晰,且可在编译期部分优化。

Ranges 不是语法糖,它是 C++ 向声明式、组合式、安全高效编程迈出的关键一步。它让算法更易读、更难写错、更容易复用。你不需要立刻重写全部代码,但从下一个新函数开始,试着用 std::ranges::| std::views::,你会很快感受到那种“本该如此”的流畅感。


# python  # access  # 工具  # unix  # c++  # 标准库  # red 


相关文章: 如何在宝塔面板创建新站点?  建站主机是什么?如何选择适合的建站主机?  大同网页,大同瑞慈医院官网?  网站制作公司,橙子建站是合法的吗?  深入理解Android中的xmlns:tools属性  定制建站是什么?如何实现个性化需求?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  深圳网站制作的公司有哪些,dido官方网站?  开源网站制作软件,开源网站什么意思?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  济南企业网站制作公司,济南社保单位网上缴费步骤?  活动邀请函制作网站有哪些,活动邀请函文案?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  招贴海报怎么做,什么是海报招贴?  如何快速查询网站的真实建站时间?  广州商城建站系统开发成本与周期如何控制?  如何高效生成建站之星成品网站源码?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  ppt制作免费网站有哪些,ppt模板免费下载网站?  公司门户网站制作流程,华为官网怎么做?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  中山网站推广排名,中山信息港登录入口?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何在阿里云虚拟主机上快速搭建个人网站?  如何在景安云服务器上绑定域名并配置虚拟主机?  建站之星伪静态规则如何正确配置?  如何彻底卸载建站之星软件?  宝塔新建站点报错如何解决?  如何挑选高效建站主机与优质域名?  如何做网站制作流程,*游戏网站怎么搭建?  简单实现Android文件上传  如何获取上海专业网站定制建站电话?  在线制作视频的网站有哪些,电脑如何制作视频短片?  代刷网站制作软件,别人代刷火车票靠谱吗?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  制作网页的网站有哪些,电脑上怎么做网页?  如何高效搭建专业期货交易平台网站?  ,交易猫的商品怎么发布到网站上去?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  建站之星ASP如何实现CMS高效搭建与安全管理?  北京企业网站设计制作公司,北京铁路集团官方网站?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  jQuery 常见小例汇总  建站主机核心功能解析:服务器选择与网站搭建流程指南  如何快速生成高效建站系统源代码?  建站主机选择指南:服务器配置与SEO优化实战技巧  建站之星后台密码遗忘如何找回? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。