C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串\x1b’ ) • 127 表示 DEL 键(‘ \x7f’ )等 • 0~31 和 127 这些整数,就构成了 ASCII 码中控制字符的部分。 关于控制字符的一个冷知识 • 在 Linux 命令行中启动 cat 。 • 试试按 Ctrl+R , Ctrl+E , Ctrl+C 等一系列 组合键,看到出现了什么? • 可以看到显示的字符变成了 ^R ^E ^C 等… … • 这是 Unix 只有 3 字节, wchar_t 的 4 字节有一个字节总是为 0 的),这会导致现有的 C 语言函数用不了,例如 strlen(s) 现在总是会返回 3 了。 • 因此 C 语言为了适应这个变化,推出了专门针对 wchar_t 的 wcslen 、 wcscpy 、 wmemset 等函数。 • Windows 也赶紧推出 LoadLibraryA 和 LoadLibraryW 两个版本,分别伺候喜欢 wstring_view 。 u8“ 字符” s 会得到 u8string 。 实验代码( course/15/09/a.cpp ) 实验代码( course/15/09/b.cpp ) Linux 命令行实验 Linux 命令行实验 字符串应用实战(作业) 第 10 章 课后作业 • 输入是一个文本文件 a.txt : • 1 xxx • 4 yyyyyyy • 3 zzzz • 2 wwwww •0 码力 | 162 页 | 40.20 MB | 1 年前3
现代C++ 教程:高速上手C++11/14/17/20辑器中, 制表符可能会被自动替换掉,请自行确保在 Makefile 中的缩进是由制表符完成的。 如果你还不知道 Makefile 的使用也没有关系,本教程中不会构建过于复杂的代码,简单的 在命令行中使用 clang++ -std=c++2a 也可以阅读本书。 如果你是首次接触现代 C++,那么你很可能还看不懂上面的那一小段代码,即: [out = std::ref(std::cout << stored_value == 1, 而 value == 100. // 因为 copy_value 在创建时就保存了一份 value 的拷贝 } 2. 引用捕获 与引用传参类似,引用捕获保存的是引用,值会发生变化。 void lambda_reference_capture() { int value = 1; 34 3.1 Lambda 表达式 第 3 章语言运行期的强化 auto copy_value 优化导致程序出错的情况 产生疑惑。例如,布尔值 notified 没有被 volatile 修饰,编译器可能对此变量存在优化,例如将其作 为一个寄存器的值,从而导致消费者线程永远无法观察到此值的变化。这是一个好问题,为了解释清楚 这个问题,我们需要进一步讨论从 C++ 11 起引入的内存模型这一概念。我们首先来看一个问题,下面 这段代码输出结果是多少? #include0 码力 | 83 页 | 2.42 MB | 1 年前3
Hello 算法 1.0.0b1 C++版写在前面 hello‑algo.com 5 Figure 0‑4. 运行代码示例 第一步:安装本地编程环境。参照附录教程,如果已有可直接跳过。 第二步:下载代码仓。如果已经安装 Git ,可以通过命令行来克隆代码仓。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以点击“Download ZIP”直接下载代码压缩包,本地解压即可。 A 比算法 B 运行时间更短;但换到另一台配置不同的计算机中,可能会得到相反的测试结果。这意味着我们需要在各种机 器上展开测试,而这是不现实的。 展开完整测试非常耗费资源。随着输入数据量的大小变化,算法会呈现出不同的效率表现。比如,有可能输入 数据量较小时,算法 A 运行时间短于算法 B ,而在输入数据量较大时,测试结果截然相反。因此,若想要达 到具有说服力的对比结果,那么需要输入各种体 如果遇到看不懂的地方无需担心, 可以在学习完后面章节后再来复习,现阶段先聚焦在理解时间复杂度含义和推算方法上。 常数阶 ?(1) 常数阶的操作数量与输入数据大小 ? 无关,即不随着 ? 的变化而变化。 对于以下算法,无论操作数量 size 有多大,只要与数据大小 ? 无关,时间复杂度就仍为 ?(1) 。 // === File: time_complexity.cpp === /* 常数阶0 码力 | 187 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 C++版写在前面 hello‑algo.com 5 Figure 0‑4. 运行代码示例 第一步:安装本地编程环境。参照附录教程,如果已有可直接跳过。 第二步:下载代码仓。如果已经安装 Git ,可以通过命令行来克隆代码仓。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以点击“Download ZIP”直接下载代码压缩包,本地解压即可。 A 比算法 B 运行时间更短;但换到另一台配置不同的计算机中,可能会得到相反的测试结果。这意味着我们需要在各种机 器上展开测试,而这是不现实的。 展开完整测试非常耗费资源。随着输入数据量的大小变化,算法会呈现出不同的效率表现。比如,有可能输入 数据量较小时,算法 A 运行时间短于算法 B ,而在输入数据量较大时,测试结果截然相反。因此,若想要达 到具有说服力的对比结果,那么需要输入各种体 如果遇到看不懂的地方无需担心, 可以在学习完后面章节后再来复习,现阶段先聚焦在理解时间复杂度含义和推算方法上。 常数阶 ?(1) 常数阶的操作数量与输入数据大小 ? 无关,即不随着 ? 的变化而变化。 对于以下算法,无论操作数量 size 有多大,只要与数据大小 ? 无关,时间复杂度就仍为 ?(1) 。 // === File: time_complexity.cpp === /* 常数阶0 码力 | 197 页 | 15.72 MB | 1 年前3
Hello 算法 1.0.0b4 C++版A 的运行时 间比算法 B 短;但在另一台配置不同的计算机中,我们可能得到相反的测试结果。这意味着我们需要在各种 机器上进行测试,而这是不现实的。 展开完整测试非常耗费资源。随着输入数据量的变化,算法会表现出不同的效率。例如,输入数据量较小时, 算法 A 的运行时间可能短于算法 B;而输入数据量较大时,测试结果可能相反。因此,为了得到有说服力的 结论,我们需要测试各种规模的输入数据,这样需要占用大量的计算资源。 到不理解的部分,请不要担 心,可以在学习完后面章节后再回顾。现阶段,请先专注于理解时间复杂度的含义和推算方法。 常数阶 ?(1) 常数阶的操作数量与输入数据大小 ? 无关,即不随着 ? 的变化而变化。 对于以下算法,尽管操作数量 size 可能很大,但由于其与数据大小 ? 无关,因此时间复杂度仍为 ?(1) 。 2. 复杂度 hello‑algo.com 20 // === File: 对于密码学的相关应用,哈希算法需要满足更高的安全标准,以防止从哈希值推导出原始密码等逆向工程, 包括: ‧ 抗碰撞性:应当极其困难找到两个不同的输入,使得它们的哈希值相同。 ‧ 雪崩效应:输入的微小变化应当导致输出的显著且不可预测的变化。 请注意,“均匀分布”与“抗碰撞性”是两个独立的概念,满足均匀分布不一定满足抗碰撞性。例如,在随机 输入 key 下,哈希函数 key % 100 可以产生均匀分布的输出。然而该哈希算法过于简单,所有后两位相等的0 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.1.0 C++ 版时间比算法 B 短;但在另一台配置不同的计算机中,可能得到相反的测试结果。这意味着我们需要在各种机 器上进行测试,统计平均效率,而这是不现实的。 另一方面,展开完整测试非常耗费资源。随着输入数据量的变化,算法会表现出不同的效率。例如,在输入 数据量较小时,算法 A 的运行时间比算法 B 短;而在输入数据量较大时,测试结果可能恰恰相反。因此,为 了得到有说服力的结论,我们需要测试各种规模的输入数据,而这需要耗费大量的计算资源。 < 阶乘阶 第 2 章 复杂度分析 hello‑algo.com 33 图 2‑9 常见的时间复杂度类型 1. 常数阶 ?(1) 常数阶的操作数量与输入数据大小 ? 无关,即不随着 ? 的变化而变化。 在以下函数中,尽管操作数量 size 可能很大,但由于其与输入数据大小 ? 无关,因此时间复杂度仍为 ?(1) : // === File: time_complexity.cpp === 基于链表可实现:栈、队列、哈希表、树、堆、图等。 链表在初始化后,仍可以在程序运行过程中对其长度进行调整,因此也称“动态数据结构”。数组在初始化后 长度不可变,因此也称“静态数据结构”。值得注意的是,数组可通过重新分配内存实现长度变化,从而具备 一定的“动态性”。 Tip 如果你感觉物理结构理解起来有困难,建议先阅读下一章,然后再回顾本节内容。 3.2 基本数据类型 当谈及计算机中的数据时,我们会想到文本、图片、视频、语音、3D0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0b5 C++版运行时间比算法 B 短;但在另一台配置不同的计算机中,我们可能得到相反的测试结果。这意味着我们需要 在各种机器上进行测试,统计平均效率,而这是不现实的。 另一方面,展开完整测试非常耗费资源。随着输入数据量的变化,算法会表现出不同的效率。例如,在输入 数据量较小时,算法 A 的运行时间比算法 B 更少;而输入数据量较大时,测试结果可能恰恰相反。因此,为 了得到有说服力的结论,我们需要测试各种规模的输入数据,而这需要耗费大量的计算资源。 对数阶 < 线性阶 < 线性对数阶 < 平方阶 < 指数阶 < 阶乘阶 图 2‑9 常见的时间复杂度类型 1. 常数阶 ?(1) 常数阶的操作数量与输入数据大小 ? 无关,即不随着 ? 的变化而变化。 第 2 章 复杂度分析 hello‑algo.com 31 在以下函数中,尽管操作数量 size 可能很大,但由于其与输入数据大小 ? 无关,因此时间复杂度仍为 ?(1) : // === 存储在同一链表中。图 6‑5 展示了一个链式地址哈希表的 例子。 第 6 章 哈希表 hello‑algo.com 117 图 6‑5 链式地址哈希表 哈希表在链式地址下的操作方法发生了一些变化。 ‧ 查询元素:输入 key ,经过哈希函数得到数组索引,即可访问链表头节点,然后遍历链表并对比 key 以 查找目标键值对。 ‧ 添加元素:先通过哈希函数访问链表头节点,然后将节点(即键值对)添加到链表中。0 码力 | 377 页 | 30.69 MB | 1 年前3
Hello 算法 1.0.0 C++版时间比算法 B 短;但在另一台配置不同的计算机中,可能得到相反的测试结果。这意味着我们需要在各种机 器上进行测试,统计平均效率,而这是不现实的。 另一方面,展开完整测试非常耗费资源。随着输入数据量的变化,算法会表现出不同的效率。例如,在输入 数据量较小时,算法 A 的运行时间比算法 B 短;而在输入数据量较大时,测试结果可能恰恰相反。因此,为 了得到有说服力的结论,我们需要测试各种规模的输入数据,而这需要耗费大量的计算资源。 < 阶乘阶 第 2 章 复杂度分析 hello‑algo.com 33 图 2‑9 常见的时间复杂度类型 1. 常数阶 ?(1) 常数阶的操作数量与输入数据大小 ? 无关,即不随着 ? 的变化而变化。 在以下函数中,尽管操作数量 size 可能很大,但由于其与输入数据大小 ? 无关,因此时间复杂度仍为 ?(1) : // === File: time_complexity.cpp === 同一链表中。图 6‑5 展示了一个链式地址哈希表的 例子。 图 6‑5 链式地址哈希表 第 6 章 哈希表 hello‑algo.com 122 基于链式地址实现的哈希表的操作方法发生了以下变化。 ‧ 查询元素:输入 key ,经过哈希函数得到桶索引,即可访问链表头节点,然后遍历链表并对比 key 以查 找目标键值对。 ‧ 添加元素:首先通过哈希函数访问链表头节点,然后将节点(键值对)添加到链表中。0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版现就会更好。也 就是说,算法在不同的机器上的测试结果可能是不一致的。这意味着我们需要在各种机器上进行测试,统计 平均效率,而这是不现实的。 另一方面,展开完整测试非常耗费资源。随着输入数据量的变化,算法会表现出不同的效率。例如,在输入 数据量较小时,算法 A 的运行时间比算法 B 短;而在输入数据量较大时,测试结果可能恰恰相反。因此,为 了得到有说服力的结论,我们需要测试各种规模的输入数据,而这需要耗费大量的计算资源。 阶乘阶 第 2 章 复杂度分析 www.hello‑algo.com 33 图 2‑9 常见的时间复杂度类型 1. 常数阶 ?(1) 常数阶的操作数量与输入数据大小 ? 无关,即不随着 ? 的变化而变化。 在以下函数中,尽管操作数量 size 可能很大,但由于其与输入数据大小 ? 无关,因此时间复杂度仍为 ?(1) : // === File: time_complexity.cpp === 基于链表可实现:栈、队列、哈希表、树、堆、图等。 链表在初始化后,仍可以在程序运行过程中对其长度进行调整,因此也称“动态数据结构”。数组在初始化后 长度不可变,因此也称“静态数据结构”。值得注意的是,数组可通过重新分配内存实现长度变化,从而具备 一定的“动态性”。 Tip 如果你感觉物理结构理解起来有困难,建议先阅读下一章,然后再回顾本节内容。 3.2 基本数据类型 当谈及计算机中的数据时,我们会想到文本、图片、视频、语音、3D0 码力 | 379 页 | 18.48 MB | 10 月前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南CMake 。 • 现代 CMake 和古代 CMake 相比,使用 更方便,功能更强大。 为什么要学习现代 CMake ? 现代 CMake : 古代 CMake : 第 0 章:命令行小技巧 传统的 CMake 软件构建 / 安装方式 • mkdir build • cd build • cmake .. • make -j4 • sudo make install 目录再切换进去再指定源码目录的麻烦。 • cmake --build build 统一了不同平台( Linux 上会调用 make , Windows 上调用 devenv.exe ) • 结论:从现在开始,如果在命令行操作 cmake ,请使用更方便的 -B 和 --build 命令。 // 在源码目录用 -B 直接创建 build 目录并生成 build/Makefile // 自动调用本地的构建系统在 build 因此,如果发现一个项目里的 add_library 都是无参数的,意味着你可以用 : cmake -B build -DBUILD_SHARED_LIBS:BOOL=ON 来让他全部生成为动态库。稍后会详解命令行传递变量的规则。 小技巧:设定一个变量的默认值 要让 BUILD_SHARED_LIBS 默认为 ON ,可以用下图这个方法: 如果该变量没有定义,则设为 ON ,否则保持用户指定的值不变。 这样当用户没有指定0 码力 | 166 页 | 6.54 MB | 1 年前3
共 20 条
- 1
- 2













