新闻中心
C++20中的范围库(ranges)怎么用_C++容器操作与ranges库应用
C++20的ranges提供声明式容器操作,支持链式调用视图与算法,简化数据处理。

在C++20中,ranges库为容器操作带来了更现代、更直观的编程方式。它允许你以声明式风格处理序列数据,无需显式使用迭代器或算法函数对象。相比传统的STL算法(如std::sort、std::transform),ranges提供了更简洁的语法和更强的组合能力。
什么是Ranges?
Ranges是C++20引入的一个核心特性,它将“范围”(range)抽象为可遍历的对象,比如数组、vector、string等支持begin()和end()的容器。ranges库在此基础上提供了一系列视图(views)、动作(actions)和算法(algorithms),可以链式调用进行数据处理。
关键组件包括:
-
Range概念:满足
std::ranges::range要求的类型,即有begin()和end()成员或可用ADL查找。 - View:轻量、延迟计算的范围适配器,不拥有数据,常用于过滤、转换等操作。
-
Range算法:如
std::ranges::sort、std::ranges::find等,直接接受容器而非迭代器对。
常用操作示例
下面通过几个常见场景展示如何使用ranges进行容器操作。
1. 排序与去重
传统写法需要传递begin()和end():
std::vector<int> vec = {5, 3, 3, 7, 1};
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
使用C++20 ranges后更清晰:
#include <algorithm>
#include <vector>
#include <ranges>
<p>std::vector<int> vec = {5, 3, 3, 7, 1};
std::ranges::sort(vec);
auto [first, last] = std::ranges::unique(vec); // 返回一对迭代器
vec.erase(first, last);</p>2. 链式视图操作(filter + transform)
假设你想从一个整数vector中选出偶数,并将其平方输出:
#include <ranges>
#include <iostream>
#include <vector>
<p>std::vector<int> nums = {1, 2, 3, 4, 5, 6};</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/ai/928">
<img src="https://img.php.cn/upload/ai_manual/001/503/042/68b6d2ba56634627.png" alt="Perplexity">
</a>
<div class="aritcle_card_info">
<a href="/ai/928">Perplexity</a>
<p>Perplexity是一个ChatGPT和谷歌结合的超级工具,可以让你在浏览互联网时提出问题或获得即时摘要</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="Perplexity">
<span>302</span>
</div>
</div>
<a href="/ai/928" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="Perplexity">
</a>
</div>
<p>auto result =
nums | std::views::filter([](int n){ return n % 2 == 0; })
| std::views::transform([](int n){ return n * n; });</p><p>for (int x : result) {
std::cout << x << " "; // 输出: 4 16 36
}</p>这里|操作符实现了管道式语法,代码逻辑一目了然。
3. 取前N个元素或跳过某些元素
auto first_three = nums | std::views::take(3); // 前三个 auto skip_two = nums | std::views::drop(2); // 跳过前两个 auto reversed = nums | std::views::reverse; // 反转顺序
这些视图都是延迟求值的,只有在遍历时才会执行实际操作,性能高效。
结合容器的实际应用技巧
在真实项目中,你可以用ranges简化复杂的数据处理流程。
示例:提取字符串长度大于3的姓名并转大写
#include <string>
#include <vector>
#include <ranges>
#include <algorithm>
#include <cctype>
<p>std::vector<std::string> names = {"Tom", "Alice", "Bob", "Eve", "Charlie"};</p><p>auto processed = names
| std::views::filter([](const std::string& s) { return s.size() > 3; })
| std::views::transform([](std::string s) -> std::string {
std::transform(s.begin(), s.end(), s.begin(), ::toupper);
return s;
});</p><p>for (const auto& name : processed) {
std::cout << name << "\n"; // 输出 ALICE, CHARLIE
}
</font>注意:若要保存结果,可构造新容器:
std::vector<std::string> result(processed.begin(), processed.end());
注意事项与限制
虽然ranges强大,但也需注意以下几点:
- 视图是惰性的,不会立即执行,适合大数据流处理,但调试时看不到中间值。
- 某些适配器组合可能导致编译时间变长或错误信息复杂。
- 必须使用支持C++20的编译器(如GCC 10+、Clang 10+、MSVC 19.29+)。
- 避免对临时对象创建视图引用,可能导致悬空引用。
基本上就这些。C++20的ranges让容器操作变得更接近函数式风格,提升可读性和开发效率。合理使用能显著减少样板代码,尤其是在数据过滤、转换和聚合场景下表现优异。
以上就是C++20中的范围库(ranges)怎么用_C++容器操作与ranges库应用的详细内容,更多请关注其它相关文章!
# 大数据
# go
# 南京问答营销推广团队
# 广电类app营销推广
# 自助网站建设弊端有哪些
# 网站推广运营3000字
# 排名优化网站推荐大全
# 创业营销推广怎么做
# 企业网站如何建设温州
# 肇庆搜索网站优化
# seo代理外包
# 网站建设文案素材图片
# 复用
# 多路
# 管理机制
# 如何实现
# 何为
# 跳过
# 迭代
# 数据处理
# 都是
# 链式
# stream
# ios
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
WordPress插件开发:正确注册卸载钩子与避免常见陷阱
Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址
C++如何操作注册表_Windows平台下C++读写注册表的API函数详解
不同用户不同价格! 索尼开启账户个性化定价测试
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
在FastAPI中利用lifespan与依赖注入高效管理Redis连接池
单射、满射与双射的关系 一文理清所有逻辑
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析
将HTML Canvas内容转换为可上传的图像文件(File对象)
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程
KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
b站怎么取消点赞_b站点赞取消操作方法
J*aScript Promise链中如何正确终止后续.then执行并处理错误
QQ网页版官方账号入口 QQ网页版网页版登录指南
Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明
抖音怎么赚钱_抖音创作者变现方法与途径指南
Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题
sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置
Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求
Discord Slash 命令响应超时问题的异步解决方案
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
12306几点到几点不能订票? | 官方最新系统维护时间全解析
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
解决 MongoDB 聚合查询中对象数组 _id 匹配问题
mc.js游戏直达 mc.js网页免下载版本秒进地址
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
Python模块化编程:有效管理依赖与避免循环引用
Golang如何使用net/url解析URL_Golang URL解析与处理方法
德邦快递查询平台 德邦快递物流信息查询入口
Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置
css链接悬停下划线样式如何自定义_使用::after结合content和transition
58动漫网在线官方网 58动漫网正版动漫入口网址
html5 app怎么运行环境_配html5 app运行环境【教程】
poki网页游戏推荐_poki免费游戏平台入口
Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
批改网学生版PC登录 批改网官网登录系统入口
蛙漫移动版在线看 蛙漫手机浏览器直达入口


2025-11-12
浏览次数:次
返回列表
s::drop(2); // 跳过前两个
auto reversed = nums | std::views::reverse; // 反转顺序