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

你好,我是吴咏炜。
在第 29 讲我介绍过范围(ranges),但当时范围才刚刚标准化,主流编译器对它的支持还比较弱,最佳实践也不够多。今天这讲内容,可以看作是第 29 讲的更新和补充,重点放在为你介绍范围库提供的好用功能上。
基本概念
在第 29 讲我介绍过范围库的基本概念,尤其是:
range(范围)
view(视图)
让我们来回忆一下。
范围
对于范围,标准库里定义了 std::ranges::range 概念。从语法上来说,一个范围需要支持 std::ranges::begin 和 std::ranges::end 操作。跟 std::begin 和 std::end 相比,ranges 名空间下的这两个函数通过特殊的技巧做到了以下两点:
要求实参要么是个左值,要么通过特化之类的技巧声明自己是一个 borrowed_range(被借用的范围)。一个 borrowed_range 的迭代器可以独立于该范围本身存在,因此使用它的右值作为 ranges 下的 begin 和 end 的实参也是合法的。除此之外,传递右值会导致编译错误,因为结果迭代器有悬空的风险。
能进行实参依赖查找,即对用户的名空间(如 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
《现代 C++ 编程实战》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论