新闻中心
c++20 Ranges库入门教程_c++ std::ranges用法与视图详解【新特性】
std::ranges是C++20对标准算法的现代化重设计,提供范围重载、惰性视图和概念约束;支持直接传容器、链式视图组合(如filter|transform)、零拷贝计算,并要求C++20编译支持。

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被称为“欧洲版的OpenAI”,也是目前欧洲最强的 LLM 大模型平台
182
查看详情
-
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 { retur
n {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中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩
汽水音乐在线解析 汽水音乐在线解析入口


2025-12-13
浏览次数:次
返回列表
n {from_}; }
iter end() const { return {to_}; }
};
// 现在可以直接用:for (int x : IntRange{0, 3}) { ... }
// 也能参与 views:IntRange{0,10} | views::filter(...);