现代C++实战30讲
吴咏炜
前 Intel 资深软件架构师
立即订阅
3995 人已学习
课程目录
已更新 33 讲 / 共 33 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | C++这么难,为什么我们还要用C++?
免费
课前必读 | 有关术语发音及环境要求
基础篇 (9讲)
01 | 堆、栈、RAII:C++里该如何管理资源?
02 | 自己动手,实现C++的智能指针
03 | 右值和移动究竟解决了什么问题?
04 | 容器汇编 I:比较简单的若干容器
05 | 容器汇编 II:需要函数对象的容器
06 | 异常:用还是不用,这是个问题
07 | 迭代器和好用的新for循环
08 | 易用性改进 I:自动类型推断和初始化
09 | 易用性改进 II:字面量、静态断言和成员函数说明符
提高篇 (11讲)
10 | 到底应不应该返回对象?
11 | Unicode:进入多文字支持的世界
12 | 编译期多态:泛型编程和模板入门
13 | 编译期能做些什么?一个完整的计算世界
14 | SFINAE:不是错误的替换失败是怎么回事?
15 | constexpr:一个常态的世界
16 | 函数对象和lambda:进入函数式编程
17 | 函数式编程:一种越来越流行的编程范式
18 | 应用可变模板和tuple的编译期技巧
19 | thread和future:领略异步中的未来
20 | 内存模型和atomic:理解并发的复杂性
实战篇 (7讲)
21 | 工具漫谈:编译、格式化、代码检查、排错各显身手
22 | 处理数据类型变化和错误:optional、variant、expected和Herbception
23 | 数字计算:介绍线性代数和数值计算库
24 | Boost:你需要的“瑞士军刀”
25 | 两个单元测试库:C++里如何进行单元测试?
26 | Easylogging++和spdlog:两个好用的日志库
27 | C++ REST SDK:使用现代C++开发网络应用
新年特别策划 (2讲)
新春寄语 | 35年码龄程序员:人生漫长,走点弯路在所难免
新春福利 | C++好书荐读
未来篇 (2讲)
28 | Concepts:如何对模板进行约束?
29 | Ranges:无迭代器的迭代和更方便的组合
现代C++实战30讲
登录|注册

29 | Ranges:无迭代器的迭代和更方便的组合

吴咏炜 2020-02-07
你好,我是吴咏炜。
今天,我们继续上一讲开始的话题,讨论 ranges(范围)。

Ranges 简介

像下面这样的代码:
#include <algorithm>
#include <iostream>
#include <iterator>
int main()
{
using namespace std;
int a[] = {1, 7, 3, 6,
5, 2, 4, 8};
copy(begin(a), end(a),
ostream_iterator<int>(
std::cout, " "));
std::cout << std::endl;
sort(begin(a), end(a));
copy(begin(a), end(a),
ostream_iterator<int>(
std::cout, " "));
std::cout << std::endl;
}
你应该已经见到过好多次了。有没有觉得这个代码有点重复、有点无聊呢?尤其是里面的 beginend
很多人都留意到了迭代器虽然灵活,但不是一个足够高级的抽象——尤其是我们已经对 C 数组都可以进行基于“范围”的循环之后。如果我们把数组看作一个抽象的“范围”,我们就可以得到下面的代码:
#include <experimental/ranges/algorithm>
#include <experimental/ranges/iterator>
#include <iostream>
int main()
{
using namespace std::
experimental::ranges;
int a[] = {1, 7, 3, 6,
5, 2, 4, 8};
copy(a, ostream_iterator<int>(
std::cout, " "));
std::cout << std::endl;
sort(a);
copy(a, ostream_iterator<int>(
std::cout, " "));
std::cout << std::endl;
}
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《现代C++实战30讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(2)

  • Sochooligan
    一、看得云里雾里地,好的方面是所有例子都运行了。
    二、发现两处分心的地方:
    (1)我们可以在输出 r 之前插入下面这行:
    我们可以在输出 r 之前(15行之后,16行之前)插入下面这行:
    (2)除了 view,vector 满足所有的 range 概念。
    vector 满足除view外所有的 range 概念。
    三、我的环境是 macOS+vscode+gcc9.2.0_3(Target: x86_64-apple-darwin19) +gdb8.3

    作者回复: 多看两遍。ranges 和 concepts 对于一般的开发者来说应当是很新的东西,我自己也学习了很多遍,踩了很多坑。

    二(1) 加行号说明是个好主意,我改一下吧。二(2) 两可之间的,就不动了。

    2020-02-08
    1
  • pedro
    老师能讲一讲关于c++内存安全相关的编码规范和技巧吗,我觉得这个或许才是很多同学的刚需

    作者回复: 这个我没想到很简单的讲法。

    不过,真要从简的话,最基本的要求就是,不要用 new,不要用裸指针:使用智能指针来代替。

    此外,在用到视图的时候,包括 ranges 里的视图和更简单的情况如 string_view,要确保使用视图时视图使用的对象一直存在,没有被意外销毁。视图不管理内存。

    2020-02-07
收起评论
2
返回
顶部