0

0

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

尼克

尼克

发布时间:2025-12-13 23:19:02

|

411人浏览过

|

来源于php中文网

原创

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

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

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

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

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

std::vector 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 等)

关键点:

立即学习C++免费学习笔记(深入)”;

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

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

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

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

Mistral AI
Mistral AI

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

下载
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:

  • 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 有 begin()end(),返回兼容的迭代器;
  • std::ranges::view:range + 移动代价为 O(1)(即轻量);
  • std::ranges::sized_range:支持 size() 且为 O(1);
  • std::ranges::random_access_range:支持 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,多用 | 管道,你会慢慢觉得以前的写法有点笨重。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

773

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

684

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

765

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

719

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1425

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

570

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

751

2023.08.11

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 18.3万人学习

Django 教程
Django 教程

共28课时 | 3.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号