 现代C++ 教程:高速上手C++11/14/17/20C++ 语言自身的可用性,auto 关键字语义的修改使得我 们更加有信心来操控极度复杂的模板类型。同时还对语言运行期进行了大量的强化,Lambda 表达式的出 现让 C++ 具有了『匿名函数』的『闭包』特性,而这一特性几乎在现代的编程语言(诸如 Python/Swift/. . . )中已经司空见惯,右值引用的出现解决了 C++ 长期以来被人诟病的临时对象效率问题等等。 C++17 则是近三年依赖 std::tuple 容器用于构造一个元组,进而囊括多个返回值。但缺陷是,C++11/14 并没有提供一种 简单的方法直接从元组中拿到并定义元组中的元素,尽管我们可以使用 std::tie 对元组进行拆包,但 我们依然必须非常清楚这个元组包含多少个对象,各个对象是什么类型,非常麻烦。 C++17 完善了这一设定,给出的结构化绑定可以让我们写出这样的代码: #include 现代C++ 教程:高速上手C++11/14/17/20C++ 语言自身的可用性,auto 关键字语义的修改使得我 们更加有信心来操控极度复杂的模板类型。同时还对语言运行期进行了大量的强化,Lambda 表达式的出 现让 C++ 具有了『匿名函数』的『闭包』特性,而这一特性几乎在现代的编程语言(诸如 Python/Swift/. . . )中已经司空见惯,右值引用的出现解决了 C++ 长期以来被人诟病的临时对象效率问题等等。 C++17 则是近三年依赖 std::tuple 容器用于构造一个元组,进而囊括多个返回值。但缺陷是,C++11/14 并没有提供一种 简单的方法直接从元组中拿到并定义元组中的元素,尽管我们可以使用 std::tie 对元组进行拆包,但 我们依然必须非常清楚这个元组包含多少个对象,各个对象是什么类型,非常麻烦。 C++17 完善了这一设定,给出的结构化绑定可以让我们写出这样的代码: #include- magic 函数: magic(); // 输出 0 magic(1); // 输出 1 magic(1, ""); // 输出 2 其次,对参数进行解包,到目前为止还没有一种简单的方法能够处理参数包,但有两种经典的处理 手法: 1. 递归模板函数 26 2.5 模板 第 2 章语言可用性的强化 递归是非常容易想到的一种手段,也是最经典的处理方法。这种方法不断递归地向函数传递模板参 数,进而达到递归遍历所有模板参数的目的: 0 码力 | 83 页 | 2.42 MB | 1 年前3
 Hello 算法 1.1.0 C++ 版地,我对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单、直接且有效。然而刷题就如同玩“扫雷”游戏,自学能力 强的人能够顺利将地雷逐个排掉,而基础不足的人很可能被炸得满头是包,并在挫折中步步退缩。通读教材 也是一种常见做法,但对于面向求职的人来说,毕业论文、投递简历、准备笔试和面试已经消耗了大部分精 力,啃厚重的书往往变成了一项艰巨的挑战。 如果你也面临类似的困扰, git clone https://github.com/krahets/hello-algo.git 当然,你也可以在图 0‑4 所示的位置,点击“Download ZIP”按钮直接下载代码压缩包,然后在本地解压即 可。 第 0 章 前言 hello‑algo.com 7 图 0‑4 克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?, ? + 1, … , ? − 1 : // === File: iteration.cpp === /* for 循环 */ int forLoop(int n)0 码力 | 379 页 | 18.47 MB | 1 年前3 Hello 算法 1.1.0 C++ 版地,我对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单、直接且有效。然而刷题就如同玩“扫雷”游戏,自学能力 强的人能够顺利将地雷逐个排掉,而基础不足的人很可能被炸得满头是包,并在挫折中步步退缩。通读教材 也是一种常见做法,但对于面向求职的人来说,毕业论文、投递简历、准备笔试和面试已经消耗了大部分精 力,啃厚重的书往往变成了一项艰巨的挑战。 如果你也面临类似的困扰, git clone https://github.com/krahets/hello-algo.git 当然,你也可以在图 0‑4 所示的位置,点击“Download ZIP”按钮直接下载代码压缩包,然后在本地解压即 可。 第 0 章 前言 hello‑algo.com 7 图 0‑4 克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?, ? + 1, … , ? − 1 : // === File: iteration.cpp === /* for 循环 */ int forLoop(int n)0 码力 | 379 页 | 18.47 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 C++ 版地,我对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单、直接且有效。然而刷题就如同玩“扫雷”游戏,自学能力 强的人能够顺利将地雷逐个排掉,而基础不足的人很可能被炸得满头是包,并在挫折中步步退缩。通读教材 也是一种常见做法,但对于面向求职的人来说,毕业论文、投递简历、准备笔试和面试已经消耗了大部分精 力,啃厚重的书往往变成了一项艰巨的挑战。 如果你也面临类似的困扰, git clone https://github.com/krahets/hello-algo.git 当然,你也可以在图 0‑4 所示的位置,点击“Download ZIP”按钮直接下载代码压缩包,然后在本地解压即 可。 第 0 章 前言 www.hello‑algo.com 7 图 0‑4 克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?, ? + 1, … , ? − 1 : // === File: iteration.cpp === /* for 循环 */ int forLoop(int n)0 码力 | 379 页 | 18.48 MB | 10 月前3 Hello 算法 1.2.0 简体中文 C++ 版地,我对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单、直接且有效。然而刷题就如同玩“扫雷”游戏,自学能力 强的人能够顺利将地雷逐个排掉,而基础不足的人很可能被炸得满头是包,并在挫折中步步退缩。通读教材 也是一种常见做法,但对于面向求职的人来说,毕业论文、投递简历、准备笔试和面试已经消耗了大部分精 力,啃厚重的书往往变成了一项艰巨的挑战。 如果你也面临类似的困扰, git clone https://github.com/krahets/hello-algo.git 当然,你也可以在图 0‑4 所示的位置,点击“Download ZIP”按钮直接下载代码压缩包,然后在本地解压即 可。 第 0 章 前言 www.hello‑algo.com 7 图 0‑4 克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?, ? + 1, … , ? − 1 : // === File: iteration.cpp === /* for 循环 */ int forLoop(int n)0 码力 | 379 页 | 18.48 MB | 10 月前3
 Hello 算法 1.0.0 C++版地,我对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单、直接且有效。然而刷题就如同玩“扫雷”游戏,自学能力 强的人能够顺利将地雷逐个排掉,而基础不足的人很可能被炸得满头是包,并在挫折中步步退缩。通读教材 也是一种常见做法,但对于面向求职的人来说,毕业论文、投递简历、准备笔试和面试已经消耗了大部分精 力,啃厚重的书往往变成了一项艰巨的挑战。 如果你也面临类似的困扰, git clone https://github.com/krahets/hello-algo.git 当然,你也可以在图 0‑4 所示的位置,点击“Download ZIP”按钮直接下载代码压缩包,然后在本地解压即 可。 第 0 章 前言 hello‑algo.com 7 图 0‑4 克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?, ? + 1, … , ? − 1 : // === File: iteration.cpp === /* for 循环 */ int forLoop(int n)0 码力 | 378 页 | 17.59 MB | 1 年前3 Hello 算法 1.0.0 C++版地,我对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单、直接且有效。然而刷题就如同玩“扫雷”游戏,自学能力 强的人能够顺利将地雷逐个排掉,而基础不足的人很可能被炸得满头是包,并在挫折中步步退缩。通读教材 也是一种常见做法,但对于面向求职的人来说,毕业论文、投递简历、准备笔试和面试已经消耗了大部分精 力,啃厚重的书往往变成了一项艰巨的挑战。 如果你也面临类似的困扰, git clone https://github.com/krahets/hello-algo.git 当然,你也可以在图 0‑4 所示的位置,点击“Download ZIP”按钮直接下载代码压缩包,然后在本地解压即 可。 第 0 章 前言 hello‑algo.com 7 图 0‑4 克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?, ? + 1, … , ? − 1 : // === File: iteration.cpp === /* for 循环 */ int forLoop(int n)0 码力 | 378 页 | 17.59 MB | 1 年前3
 Hello 算法 1.0.0b1 C++版渐渐也对这个问题好奇了起来。 两眼一抹黑地刷题应该是最受欢迎的方式,简单粗暴且有效。然而,刷题就如同玩“扫雷”游戏,自学能力强 的同学能够顺利地将地雷逐个排掉,而基础不足的同学很可能被炸的满头是包,并在受挫中步步退缩。通读教 材书籍也是常用方法,但对于面向求职的同学来说,毕业季、投递简历、应付笔面试已经占用大部分精力,厚 重的书本也因此成为巨大的挑战。 如果你也有上述烦恼,那么很幸运这本 ,可以通过命令行来克隆代码仓。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以点击“Download ZIP”直接下载代码压缩包,本地解压即可。 Figure 0‑5. 克隆仓库与下载代码 第三步:运行源代码。若代码块的顶部标有文件名称,则可在仓库 codes 文件夹中找到对应的 源代码文件。源 代码文件可以帮助你省去不 : 10. 查找算法 hello‑algo.com 155 1. 双闭区间 [0, ? − 1] ,即两个边界都包含自身;此方法下,区间 [0, 0] 仍包含一个元素; 2. 左闭右开 [0, ?) ,即左边界包含自身、右边界不包含自身;此方法下,区间 [0, 0) 为空; “双闭区间”实现 首先,我们先采用“双闭区间”的表示,在数组 nums 中查找目标元素 target 的对应索引。0 码力 | 187 页 | 14.71 MB | 1 年前3 Hello 算法 1.0.0b1 C++版渐渐也对这个问题好奇了起来。 两眼一抹黑地刷题应该是最受欢迎的方式,简单粗暴且有效。然而,刷题就如同玩“扫雷”游戏,自学能力强 的同学能够顺利地将地雷逐个排掉,而基础不足的同学很可能被炸的满头是包,并在受挫中步步退缩。通读教 材书籍也是常用方法,但对于面向求职的同学来说,毕业季、投递简历、应付笔面试已经占用大部分精力,厚 重的书本也因此成为巨大的挑战。 如果你也有上述烦恼,那么很幸运这本 ,可以通过命令行来克隆代码仓。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以点击“Download ZIP”直接下载代码压缩包,本地解压即可。 Figure 0‑5. 克隆仓库与下载代码 第三步:运行源代码。若代码块的顶部标有文件名称,则可在仓库 codes 文件夹中找到对应的 源代码文件。源 代码文件可以帮助你省去不 : 10. 查找算法 hello‑algo.com 155 1. 双闭区间 [0, ? − 1] ,即两个边界都包含自身;此方法下,区间 [0, 0] 仍包含一个元素; 2. 左闭右开 [0, ?) ,即左边界包含自身、右边界不包含自身;此方法下,区间 [0, 0) 为空; “双闭区间”实现 首先,我们先采用“双闭区间”的表示,在数组 nums 中查找目标元素 target 的对应索引。0 码力 | 187 页 | 14.71 MB | 1 年前3
 Hello 算法 1.0.0b4 C++版个问题产生了浓厚的兴 趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单直接且有效。然而,刷题就如同玩“扫雷”游戏,自学能力 强的同学能够顺利地将地雷逐个排掉,而基础不足的同学很可能被炸的满头是包,并在挫折中步步退缩。通 读教材书籍也是一种常见做法,但对于面向求职的同学来说,毕业季、投递简历、准备笔试面试已经占据了 大部分精力,厚重的书籍往往变成了一项艰巨的挑战。 如果你也面临类似的困扰 ,可以通过以下命令克隆本仓库。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以点击“Download ZIP”直接下载代码压缩包,然后在本地解压即可。 0. 前言 hello‑algo.com 5 Figure 0‑4. 克隆仓库与下载代码 第三步:运行源代码。如果代码块顶部标有文件名称,则可以在仓库的 codes 文件夹中找到相应的源代码文 在该数组中的索引。若数组不包含该元素,则返回 −1 。 对于上述问题,我们先初始化指针 ? = 0 和 ? = ? − 1 ,分别指向数组首元素和尾元素,代表搜索区间 [0, ? − 1] 。其中,中括号表示“闭区间”,即包含边界值本身。 接下来,循环执行以下两个步骤: 1. 计算中点索引 ? = ⌊(? + ?)/2⌋ ,其中 ⌊⌋ 表示向下取整操作。 2. 判断 nums[m] 和 target 的大小关系,分为三种情况:0 码力 | 343 页 | 27.39 MB | 1 年前3 Hello 算法 1.0.0b4 C++版个问题产生了浓厚的兴 趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单直接且有效。然而,刷题就如同玩“扫雷”游戏,自学能力 强的同学能够顺利地将地雷逐个排掉,而基础不足的同学很可能被炸的满头是包,并在挫折中步步退缩。通 读教材书籍也是一种常见做法,但对于面向求职的同学来说,毕业季、投递简历、准备笔试面试已经占据了 大部分精力,厚重的书籍往往变成了一项艰巨的挑战。 如果你也面临类似的困扰 ,可以通过以下命令克隆本仓库。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以点击“Download ZIP”直接下载代码压缩包,然后在本地解压即可。 0. 前言 hello‑algo.com 5 Figure 0‑4. 克隆仓库与下载代码 第三步:运行源代码。如果代码块顶部标有文件名称,则可以在仓库的 codes 文件夹中找到相应的源代码文 在该数组中的索引。若数组不包含该元素,则返回 −1 。 对于上述问题,我们先初始化指针 ? = 0 和 ? = ? − 1 ,分别指向数组首元素和尾元素,代表搜索区间 [0, ? − 1] 。其中,中括号表示“闭区间”,即包含边界值本身。 接下来,循环执行以下两个步骤: 1. 计算中点索引 ? = ⌊(? + ?)/2⌋ ,其中 ⌊⌋ 表示向下取整操作。 2. 判断 nums[m] 和 target 的大小关系,分为三种情况:0 码力 | 343 页 | 27.39 MB | 1 年前3
 Hello 算法 1.0.0b5 C++版我逐渐对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单直接且有效。刷题就如同玩“扫雷”游戏,自学能力强的同 学能够顺利地将地雷逐个排掉,而基础不足的同学很可能被炸的满头是包,并在挫折中步步退缩。通读教材 书籍也是一种常见做法,但对于面向求职的同学来说,毕业季、投递简历、准备笔试面试已经占据了大部分 精力,厚重的书籍往往变成了一项艰巨的挑战。 如果你也面临类似的困扰 ,可以通过以下命令克隆本仓库。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以在图 0‑4 所示的位置,点击“Download ZIP”直接下载代码压缩包,然后在本地解压即可。 第 0 章 前言 hello‑algo.com 6 图 0‑4 克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 循环是最常见的迭代形式之一,适合预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?, ? + 1, … , ? − 1 。 // === File: iteration.cpp === /* for 循环 */ int forLoop(int n)0 码力 | 377 页 | 30.69 MB | 1 年前3 Hello 算法 1.0.0b5 C++版我逐渐对这个问题产生了浓厚的兴趣。 两眼一抹黑地刷题似乎是最受欢迎的方法,简单直接且有效。刷题就如同玩“扫雷”游戏,自学能力强的同 学能够顺利地将地雷逐个排掉,而基础不足的同学很可能被炸的满头是包,并在挫折中步步退缩。通读教材 书籍也是一种常见做法,但对于面向求职的同学来说,毕业季、投递简历、准备笔试面试已经占据了大部分 精力,厚重的书籍往往变成了一项艰巨的挑战。 如果你也面临类似的困扰 ,可以通过以下命令克隆本仓库。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以在图 0‑4 所示的位置,点击“Download ZIP”直接下载代码压缩包,然后在本地解压即可。 第 0 章 前言 hello‑algo.com 6 图 0‑4 克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 循环是最常见的迭代形式之一,适合预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?, ? + 1, … , ? − 1 。 // === File: iteration.cpp === /* for 循环 */ int forLoop(int n)0 码力 | 377 页 | 30.69 MB | 1 年前3
 Hello 算法 1.0.0b2 C++版渐渐也对这个问题好奇了起来。 两眼一抹黑地刷题应该是最受欢迎的方式,简单粗暴且有效。然而,刷题就如同玩“扫雷”游戏,自学能力强 的同学能够顺利地将地雷逐个排掉,而基础不足的同学很可能被炸的满头是包,并在受挫中步步退缩。通读教 材书籍也是常用方法,但对于面向求职的同学来说,毕业季、投递简历、应付笔面试已经占用大部分精力,厚 重的书本也因此成为巨大的挑战。 如果你也有上述烦恼,那么很幸运这本 ,可以通过命令行来克隆代码仓。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以点击“Download ZIP”直接下载代码压缩包,本地解压即可。 Figure 0‑5. 克隆仓库与下载代码 第三步:运行源代码。若代码块的顶部标有文件名称,则可在仓库 codes 文件夹中找到对应的 源代码文件。源 代码文件可以帮助你省去不 : 10. 查找算法 hello‑algo.com 155 1. 双闭区间 [0, ? − 1] ,即两个边界都包含自身;此方法下,区间 [0, 0] 仍包含一个元素; 2. 左闭右开 [0, ?) ,即左边界包含自身、右边界不包含自身;此方法下,区间 [0, 0) 为空; “双闭区间”实现 首先,我们先采用“双闭区间”的表示,在数组 nums 中查找目标元素 target 的对应索引。0 码力 | 197 页 | 15.72 MB | 1 年前3 Hello 算法 1.0.0b2 C++版渐渐也对这个问题好奇了起来。 两眼一抹黑地刷题应该是最受欢迎的方式,简单粗暴且有效。然而,刷题就如同玩“扫雷”游戏,自学能力强 的同学能够顺利地将地雷逐个排掉,而基础不足的同学很可能被炸的满头是包,并在受挫中步步退缩。通读教 材书籍也是常用方法,但对于面向求职的同学来说,毕业季、投递简历、应付笔面试已经占用大部分精力,厚 重的书本也因此成为巨大的挑战。 如果你也有上述烦恼,那么很幸运这本 ,可以通过命令行来克隆代码仓。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以点击“Download ZIP”直接下载代码压缩包,本地解压即可。 Figure 0‑5. 克隆仓库与下载代码 第三步:运行源代码。若代码块的顶部标有文件名称,则可在仓库 codes 文件夹中找到对应的 源代码文件。源 代码文件可以帮助你省去不 : 10. 查找算法 hello‑algo.com 155 1. 双闭区间 [0, ? − 1] ,即两个边界都包含自身;此方法下,区间 [0, 0] 仍包含一个元素; 2. 左闭右开 [0, ?) ,即左边界包含自身、右边界不包含自身;此方法下,区间 [0, 0) 为空; “双闭区间”实现 首先,我们先采用“双闭区间”的表示,在数组 nums 中查找目标元素 target 的对应索引。0 码力 | 197 页 | 15.72 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 16 现代 CMake 模块化项目管理指南function 的区别 • macro 相当于直接把代码粘贴过去,直接访问调用者的作用域。这里写的相对路径 include 和 src ,是基于调用者所在路径。 • function 则是会创建一个闭包,优先访问定义者的作用域。这里写的相对路径 include 和 src ,则是基于定义者所在路径。 https://cmake.org/cmake/help/latest/command/function • 查找名为 OpenCV 的包,找不到不报错,事后可以通过 ${OpenCV_FOUND} 查询是否找到。 • find_package(OpenCV QUIET) • 查找名为 OpenCV 的包,找不到不报错,也不打印任何信息。 • find_package(OpenCV REQUIRED) # 最常见用法 • 查找名为 OpenCV 的包,找不到就报错(并终止 cmake videoio) • 查找名为 OpenCV 的包,找不到就报错,且必须具有 OpenCV::core 和 OpenCV::videoio 这 两个组件,如果没有这两个组件也会报错。 • find_package(OpenCV REQUIRED OPTIONAL_COMPONENTS core videoio) • 查找名为 OpenCV 的包,找不到就报错,可具有 OpenCV::core0 码力 | 56 页 | 6.87 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 16 现代 CMake 模块化项目管理指南function 的区别 • macro 相当于直接把代码粘贴过去,直接访问调用者的作用域。这里写的相对路径 include 和 src ,是基于调用者所在路径。 • function 则是会创建一个闭包,优先访问定义者的作用域。这里写的相对路径 include 和 src ,则是基于定义者所在路径。 https://cmake.org/cmake/help/latest/command/function • 查找名为 OpenCV 的包,找不到不报错,事后可以通过 ${OpenCV_FOUND} 查询是否找到。 • find_package(OpenCV QUIET) • 查找名为 OpenCV 的包,找不到不报错,也不打印任何信息。 • find_package(OpenCV REQUIRED) # 最常见用法 • 查找名为 OpenCV 的包,找不到就报错(并终止 cmake videoio) • 查找名为 OpenCV 的包,找不到就报错,且必须具有 OpenCV::core 和 OpenCV::videoio 这 两个组件,如果没有这两个组件也会报错。 • find_package(OpenCV REQUIRED OPTIONAL_COMPONENTS core videoio) • 查找名为 OpenCV 的包,找不到就报错,可具有 OpenCV::core0 码力 | 56 页 | 6.87 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 03 现代 C++ 进阶:模板元编程几个,然后每个运算符都要声明一个纯虚函数吗? 而且, Float 的乘法应该是 multiply(float) ,你也去 定义好几个重载吗?定义为 multiply(Numeric *) 的话 依然会违背你们的开 - 闭原则:比如 3.14f * 3 ,两 端是不同的类型,怎么处理所有可能类型的排列组合 ? 不如放弃类和方法的概念,欣然接受全局函数和重载 。 模板函数:定义 • 使用 template C++高性能并行编程与优化 -  课件 - 03 现代 C++ 进阶:模板元编程几个,然后每个运算符都要声明一个纯虚函数吗? 而且, Float 的乘法应该是 multiply(float) ,你也去 定义好几个重载吗?定义为 multiply(Numeric *) 的话 依然会违背你们的开 - 闭原则:比如 3.14f * 3 ,两 端是不同的类型,怎么处理所有可能类型的排列组合 ? 不如放弃类和方法的概念,欣然接受全局函数和重载 。 模板函数:定义 • 使用 template- 定义的 sumto.cpp 里,增加两个显式编译模板的声明: 一般来说,我会建议模板不要 分离声明和定义,直接写在头 文件里即可。如果分离还要罗 列出所有模板参数的排列组合 ,违背了开 - 闭原则。 模板的惰性:延迟编译 • 要证明模板的惰性,只需看这个例子: • 要是编译器哪怕细看了一眼:字符串怎么可能被写入呢?肯定是会出错的。 • 但是却没有出错,这是因为模板没有被调用,所以不会被实际编译! 中的变量 • lambda 函数体中,还可以使用定义他的 main 函数中的变量,只需要把方括号 [] 改成 [&] 即可: • 函数可以引用定义位置所有的变量,这个 特性在函数式编程中称为闭包 (closure) 。 lambda 表达式:修改 main 中的变量 • [&] 不仅可以读取 main 中的变量,还可 以写入 main 中的变量,比如可以通过 counter++ 记录该函数被调用了多少次: 0 码力 | 82 页 | 12.15 MB | 1 年前3
共 17 条
- 1
- 2













