《深入浅出MFC》2/e
快,你的程序动作也比较简单。所以,你也可以在Windows 程序中产生console 窗口, 独立出来操作。 这也许不是你所认知的console 程序。总之,有这种混合式的东西存在。 这一节将以我自己的一个极简易的个人备份软件JBACKUP 为实例,说明Win32 console 程序的撰写,以及如何在其中使用Win32 API(其实直接调用就是了)。再以另 一个极小的程序MFCCON 示范MFC console 那么相当于把g:\u002\doc 备份到k:\u002\doc 中,并杀掉k:\u002\doc 的赘余文件。 JBACK 检查SrcDir 中所有的文件和DstDir 中所有的文件,把比较新的文件从SrcDir 中拷贝到DstDir 去,并把DstDir 中多出来的文件删除,使ScrDir 和DstDir 的文件保 33 持完全相同。之所以不做xcopy 完全拷贝动作,为的是节省拷贝时间(做为备份装置, 通 类别老祖宗(CObject)的对象指针来容纳 它绝对没有问题,但终不好总是如此吧!不见得这样子就能够满足你的程序需求啊。 显然,你能够以Serialize 函数写档,我能够以Serialize 函数读档,但我就是没办法恢复 你原来的状态-- 除非我的程序能够「动态生成」。 MFC 支持动态生成, 靠的是一组非常神秘的宏( DECLARE_DYNCREATE 、 IMPLEMENT_DYNCREATE)和一个非常神秘0 码力 | 1009 页 | 11.08 MB | 1 年前3Hello 算法 1.0.0b4 C++版
中的每个字符 占用 1 字节,“算法”中的每个字符占用 2 字节。我们可以通过高位填 0 ,将“Hello 算法”中的所有字符都 编码为 2 字节长度。这样系统就可以每隔 2 字节解析一个字符,恢复出这个短语的内容了。 Figure 3‑7. Unicode 编码示例 然而,ASCII 码已经向我们证明,编码英文只需要 1 字节。若采用上述方案,英文文本占用空间的大小将会 是 ASCII 树的任意节点的平衡因子皆满足 −1 ≤ ? ≤ 1 。 7.5.2. AVL 树旋转 AVL 树的特点在于「旋转 Rotation」操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重 新恢复平衡。换句话说,旋转操作既能保持树的「二叉搜索树」属性,也能使树重新变为「平衡二叉树」。 我们将平衡因子绝对值 > 1 的节点称为「失衡节点」。根据节点失衡情况的不同,旋转操作分为四种:右旋、 如下图所示,节点下方为平衡因子。从底至顶看,二叉树中首个失衡节点是“节点 3”。我们关注以该失衡节 点为根节点的子树,将该节点记为 node ,其左子节点记为 child ,执行「右旋」操作。完成右旋后,子树已 经恢复平衡,并且仍然保持二叉搜索树的特性。 Figure 7‑26. 右旋操作步骤 此外,如果节点 child 本身有右子节点(记为 grandChild ),则需要在「右旋」中添加一步:将 grandChild0 码力 | 343 页 | 27.39 MB | 1 年前3Hello 算法 1.1.0 C++ 版
系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 2. 归:当函数完成执行并返回时,对应的栈帧会被从“调用栈”上移除,恢复之前函数的执行环境。 因此,我们可以使用一个显式的栈来模拟调用栈的行为,从而将递归转化为迭代形式: // === File: recursion.cpp === /* 使用迭代模拟递归 */ 所示,“Hello”中的每个字 符占用 1 字节,“算法”中的每个字符占用 2 字节。我们可以通过高位填 0 将“Hello 算法”中的所有字符都 编码为 2 字节长度。这样系统就可以每隔 2 字节解析一个字符,恢复这个短语的内容了。 图 3‑7 Unicode 编码示例 然而 ASCII 码已经向我们证明,编码英文只需 1 字节。若采用上述方案,英文文本占用空间的大小将会是 ASCII 编码下的两倍,非 ,则一棵 AVL 树的任意节点的平衡因子皆满足 −1 ≤ ? ≤ 1 。 7.5.2 AVL 树旋转 AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重新恢复平 衡。换句话说,旋转操作既能保持“二叉搜索树”的性质,也能使树重新变为“平衡二叉树”。 我们将平衡因子绝对值 > 1 的节点称为“失衡节点”。根据节点失衡情况的不同,旋转操作分为四种:右旋、0 码力 | 379 页 | 18.47 MB | 1 年前3Hello 算法 1.0.0 C++版
系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 2. 归:当函数完成执行并返回时,对应的栈帧会被从“调用栈”上移除,恢复之前函数的执行环境。 因此,我们可以使用一个显式的栈来模拟调用栈的行为,从而将递归转化为迭代形式: // === File: recursion.cpp === /* 使用迭代模拟递归 */ 所示,“Hello”中的每个字 符占用 1 字节,“算法”中的每个字符占用 2 字节。我们可以通过高位填 0 将“Hello 算法”中的所有字符都 编码为 2 字节长度。这样系统就可以每隔 2 字节解析一个字符,恢复这个短语的内容了。 图 3‑7 Unicode 编码示例 然而 ASCII 码已经向我们证明,编码英文只需 1 字节。若采用上述方案,英文文本占用空间的大小将会是 ASCII 编码下的两倍,非 ,则一棵 AVL 树的任意节点的平衡因子皆满足 −1 ≤ ? ≤ 1 。 7.5.2 AVL 树旋转 AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重新恢复平 衡。换句话说,旋转操作既能保持“二叉搜索树”的性质,也能使树重新变为“平衡二叉树”。 我们将平衡因子绝对值 > 1 的节点称为“失衡节点”。根据节点失衡情况的不同,旋转操作分为四种:右旋、0 码力 | 378 页 | 17.59 MB | 1 年前3Hello 算法 1.0.0b5 C++版
所示,“Hello”中的每个字 符占用 1 字节,“算法”中的每个字符占用 2 字节。我们可以通过高位填 0 ,将“Hello 算法”中的所有字符 都编码为 2 字节长度。这样系统就可以每隔 2 字节解析一个字符,恢复出这个短语的内容了。 图 3‑7 Unicode 编码示例 然而 ASCII 码已经向我们证明,编码英文只需要 1 字节。若采用上述方案,英文文本占用空间的大小将会是 ASCII 编码下大小的 ,则一棵 AVL 树的任意节点的平衡因子皆满足 −1 ≤ ? ≤ 1 。 7.5.2 AVL 树旋转 AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重新恢复平 衡。换句话说,旋转操作既能保持“二叉搜索树”的性质,也能使树重新变为“平衡二叉树”。 我们将平衡因子绝对值 > 1 的节点称为“失衡节点”。根据节点失衡情况的不同,旋转操作分为四种:右旋、 所示,节点下方为平衡因子。从底至顶看,二叉树中首个失衡节点是“节点 3”。我们关注以该失衡 节点为根节点的子树,将该节点记为 node ,其左子节点记为 child ,执行“右旋”操作。完成右旋后,子树 已经恢复平衡,并且仍然保持二叉搜索树的特性。 第 7 章 树 hello‑algo.com 160 图 7‑26 右旋操作步骤 如图 7‑27 所示,当节点 child 有右子节点(记为 grandChild0 码力 | 377 页 | 30.69 MB | 1 年前3Hello 算法 1.2.0 简体中文 C++ 版
系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 2. 归:当函数完成执行并返回时,对应的栈帧会被从“调用栈”上移除,恢复之前函数的执行环境。 因此,我们可以使用一个显式的栈来模拟调用栈的行为,从而将递归转化为迭代形式: // === File: recursion.cpp === /* 使用迭代模拟递归 */ 所示,“Hello”中的每个字 符占用 1 字节,“算法”中的每个字符占用 2 字节。我们可以通过高位填 0 将“Hello 算法”中的所有字符都 编码为 2 字节长度。这样系统就可以每隔 2 字节解析一个字符,恢复这个短语的内容了。 图 3‑7 Unicode 编码示例 然而 ASCII 码已经向我们证明,编码英文只需 1 字节。若采用上述方案,英文文本占用空间的大小将会是 ASCII 编码下的两倍,非 ,则一棵 AVL 树的任意节点的平衡因子皆满足 −1 ≤ ? ≤ 1 。 7.5.2 AVL 树旋转 AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重新恢复平 衡。换句话说,旋转操作既能保持“二叉搜索树”的性质,也能使树重新变为“平衡二叉树”。 我们将平衡因子绝对值 > 1 的节点称为“失衡节点”。根据节点失衡情况的不同,旋转操作分为四种:右旋、0 码力 | 379 页 | 18.48 MB | 10 月前3Hello 算法 1.0.0b1 C++版
≤ 1 。 7.4.2. AVL 树旋转 AVL 树的独特之处在于「旋转 Rotation」的操作,其可 在不影响二叉树中序遍历序列的前提下,使失衡结点 重新恢复平衡。换言之,旋转操作既可以使树保持为「二叉搜索树」,也可以使树重新恢复为「平衡二叉树」。 我们将平衡因子的绝对值 > 1 的结点称为「失衡结点」。根据结点的失衡情况,旋转操作分为 右旋、左旋、先 右旋后左旋、先左旋后右旋,接下来我们来一起来看看它们是如何操作的。 如下图所示(结点下方为「平衡因子」),从底至顶看,二叉树中首个失衡结点是 结点 3。我们聚焦在以该失衡 结点为根结点的子树上,将该结点记为 node ,将其左子结点记为 child ,执行「右旋」操作。完成右旋后,该 子树已经恢复平衡,并且仍然为二叉搜索树。 7. 树 hello‑algo.com 114 Figure 7‑25. 右旋操作步骤 进而,如果结点 child 本身有右子结点(记为 grandChild ),则需要在「右旋」中添加一步:将 updateHeight(child); // 返回旋转后子树的根结点 return child; } Case 3 ‑ 先左后右 对于下图的失衡结点 3 ,单一使用左旋或右旋都无法使子树恢复平衡,此时需要「先左旋后右旋」,即先对 child 执行「左旋」,再对 node 执行「右旋」。 Figure 7‑29. 先左旋后右旋 Case 4 ‑ 先右后左 同理,取以上失衡二叉树的镜像,则需要「先右旋后左旋」,即先对0 码力 | 187 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b2 C++版
≤ 1 。 7.4.2. AVL 树旋转 AVL 树的独特之处在于「旋转 Rotation」的操作,其可 在不影响二叉树中序遍历序列的前提下,使失衡结点 重新恢复平衡。换言之,旋转操作既可以使树保持为「二叉搜索树」,也可以使树重新恢复为「平衡二叉树」。 我们将平衡因子的绝对值 > 1 的结点称为「失衡结点」。根据结点的失衡情况,旋转操作分为 右旋、左旋、先 右旋后左旋、先左旋后右旋,接下来我们来一起来看看它们是如何操作的。 如下图所示(结点下方为「平衡因子」),从底至顶看,二叉树中首个失衡结点是 结点 3。我们聚焦在以该失衡 结点为根结点的子树上,将该结点记为 node ,将其左子结点记为 child ,执行「右旋」操作。完成右旋后,该 子树已经恢复平衡,并且仍然为二叉搜索树。 7. 树 hello‑algo.com 114 Figure 7‑25. 右旋操作步骤 进而,如果结点 child 本身有右子结点(记为 grandChild ),则需要在「右旋」中添加一步:将 updateHeight(child); // 返回旋转后子树的根结点 return child; } Case 3 ‑ 先左后右 对于下图的失衡结点 3 ,单一使用左旋或右旋都无法使子树恢复平衡,此时需要「先左旋后右旋」,即先对 child 执行「左旋」,再对 node 执行「右旋」。 Figure 7‑29. 先左旋后右旋 Case 4 ‑ 先右后左 同理,取以上失衡二叉树的镜像,则需要「先右旋后左旋」,即先对0 码力 | 197 页 | 15.72 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理
= default (续) • 如果还想让编译器自动生成默认的无参构造函数,可以用 C++11 新增的这个语法: 不过,据我所知,初始化列表 的那个构造函数就没办法通过 = default 语法恢复…… 编译器默认生成的构造函数:拷贝构造函数 • 除了无参和初始化列表构造函数外,编译器默认还会生成这样一个特殊的构造函数: • Pig(Pig const &other); • 可见他的参数是一个0 码力 | 96 页 | 16.28 MB | 1 年前3
共 9 条
- 1