现代 C++ 编程实战
吴咏炜
前 Intel 资深软件架构师
35647 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 54 讲
现代 C++ 编程实战
15
15
1.0x
00:00/00:00
登录|注册

42 | 当代C++标准库里的范围和视图

你好,我是吴咏炜。
第 29 讲我介绍过范围(ranges),但当时范围才刚刚标准化,主流编译器对它的支持还比较弱,最佳实践也不够多。今天这讲内容,可以看作是第 29 讲的更新和补充,重点放在为你介绍范围库提供的好用功能上。

基本概念

在第 29 讲我介绍过范围库的基本概念,尤其是:
range(范围)
view(视图)
让我们来回忆一下。

范围

对于范围,标准库里定义了 std::ranges::range 概念。从语法上来说,一个范围需要支持 std::ranges::beginstd::ranges::end 操作。跟 std::beginstd::end 相比,ranges 名空间下的这两个函数通过特殊的技巧做到了以下两点:
要求实参要么是个左值,要么通过特化之类的技巧声明自己是一个 borrowed_range(被借用的范围)。一个 borrowed_range 的迭代器可以独立于该范围本身存在,因此使用它的右值作为 ranges 下的 beginend 的实参也是合法的。除此之外,传递右值会导致编译错误,因为结果迭代器有悬空的风险。
能进行实参依赖查找,即对用户的名空间(如 my)里的对象类型(如 Obj),使用 std::ranges::begin(obj) 能找到对象所在名空间里的 begin 函数(如 my::begin(Obj&))。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. C++标准库中的范围和视图概念,包括`std::ranges::range`和`std::ranges::view`的基本概念和要求。 2. 范围算法的简化代码,如使用`std::ranges::sort`替代传统的`std::sort`,以及投影参数的使用。 3. C++23中新增的支持范围的“折叠”算法,如`fold_left`和`fold_right`。 4. 引用视图和拥有视图的概念,以及通过`views::all`将容器转换为视图的方法。 5. 序列生成视图的应用,包括使用`iota`算法和`iota_view`视图生成自增序列。 6. 对视图的额外要求的变化,如对拷贝和析构的要求的放宽和取消默认构造的要求。 7. 介绍了几个其他常用视图,如`views::reverse`、`views::filter`和`views::transform`。 8. 讨论了C++20标准的修正,使得之前被认为不合法的代码能够编译通过。 9. 介绍了`borrowed_range`的概念,以及如何声明自己是一个`borrowed_range`。 10. 讨论了范围和视图的语法和语义,包括`begin`和`end`操作的要求和特性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++ 编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)