现代C++ 教程:高速上手C++11/14/17/20C++ 教程:高速上手 C++11/14/17/20 欧长坤 (hi[at]changkun.de) 最后更新 2023 年 5 月 7 日- ff6ee89 注意 此 PDF 的内容可能过期,请检查本书网站以及 GitHub 仓库以获取最新内容。 版权声明 本书系欧长坤著,采用“知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND)”进 行许可。https://creativecommons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 代码安全 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 提供了完整的正则表达式支持等等。C++98 已经被实践证明了是一种非常成功 的『范型』,而现代 C++ 的出现,则进一步推动这种范型,让 C++ 成为系统程序设计和库开发更好的 语言。Concept 提供了对模板参数编译期的检查,进一步增强了语言整体的可用性。 总而言之,我们作为 C++ 的拥护与实践者,始终保持接纳新事物的开放心态,才能更快的推进 C++ 的发展,使得这门古老而又新颖的语言更加充满活力。 目标读者0 码力 | 83 页 | 2.42 MB | 1 年前3
Hello 算法 1.0.0b5 C++版杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 件为真则继续执行,否则就结束循环。 下面,我们用 while 循环来实现求和 1 + 2 + ⋯ + ? 。 // === File: iteration.cpp === /* i; } return -1; } 值得说明的是,我们在实际中很少使用最佳时间复杂度,因为通常只有在很小概率下才能达到,可能会带来 一定的误导性。而最差时间复杂度更为实用,因为它给出了一个效率安全值,让我们可以放心地使用算法。 从上述示例可以看出,最差或最佳时间复杂度只出现于“特殊的数据分布”,这些情况的出现概率可能很小, 并不能真实地反映算法运行效率。相比之下,平均时间复杂度可以体现算法在随机输入数据下的运行效率, { if (nums[i] == target) return i; } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次拷贝到新数组。这是一个 ?(?) 的操作,在数组很大的情况下是非常耗时的。0 码力 | 377 页 | 30.69 MB | 1 年前3
Hello 算法 1.1.0 C++ 版杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 件为真,则继续执行,否则就结束循环。 下面我们用 while 循环来实现求和 1 + 2 + ⋯ + ? : // === File: iteration.cpp === /* i; } return -1; } 值得说明的是,我们在实际中很少使用最佳时间复杂度,因为通常只有在很小概率下才能达到,可能会带来 一定的误导性。而最差时间复杂度更为实用,因为它给出了一个效率安全值,让我们可以放心地使用算法。 从上述示例可以看出,最差时间复杂度和最佳时间复杂度只出现于“特殊的数据分布”,这些情况的出现概率 可能很小,并不能真实地反映算法运行效率。相比之下,平均时间复杂度可以体现算法在随机输入数据下的 { if (nums[i] == target) return i; } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0 C++版杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 件为真,则继续执行,否则就结束循环。 下面我们用 while 循环来实现求和 1 + 2 + ⋯ + ? : // === File: iteration.cpp === /* while i; } return -1; } 值得说明的是,我们在实际中很少使用最佳时间复杂度,因为通常只有在很小概率下才能达到,可能会带来 一定的误导性。而最差时间复杂度更为实用,因为它给出了一个效率安全值,让我们可以放心地使用算法。 从上述示例可以看出,最差时间复杂度和最佳时间复杂度只出现于“特殊的数据分布”,这些情况的出现概率 可能很小,并不能真实地反映算法运行效率。相比之下,平均时间复杂度可以体现算法在随机输入数据下的 { if (nums[i] == target) return i; } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 件为真,则继续执行,否则就结束循环。 下面我们用 while 循环来实现求和 1 + 2 + ⋯ + ? : // === File: iteration.cpp === /* while i; } return -1; } 值得说明的是,我们在实际中很少使用最佳时间复杂度,因为通常只有在很小概率下才能达到,可能会带来 一定的误导性。而最差时间复杂度更为实用,因为它给出了一个效率安全值,让我们可以放心地使用算法。 从上述示例可以看出,最差时间复杂度和最佳时间复杂度只出现于“特殊的数据分布”,这些情况的出现概率 可能很小,并不能真实地反映算法运行效率。相比之下,平均时间复杂度可以体现算法在随机输入数据下的 { if (nums[i] == target) return i; } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.0.0b4 C++版return -1; } � 实际应用中我们很少使用「最佳时间复杂度」,因为通常只有在很小概率下才能达到,可能会 带来一定的误导性。相反,「最差时间复杂度」更为实用,因为它给出了一个“效率安全值”, 让我们可以放心地使用算法。 从上述示例可以看出,最差或最佳时间复杂度只出现在“特殊分布的数据”中,这些情况的出现概率可能很 小,因此并不能最真实地反映算法运行效率。相较之下,「平均时间复杂度」可以体现算法在随机输入数据下 实际上,哈希算法除了可以用于实现哈希表,还广泛应用于其他领域中。举两个例子: ‧ 密码存储:为了保护用户密码的安全,系统通常不会直接存储用户的明文密码,而是存储密码的哈希 值。当用户输入密码时,系统会对输入的密码计算哈希值,然后与存储的哈希值进行比较。如果两者匹 配,那么密码就被视为正确。 ‧ 数据完整性检查:数据发送方可以计算数据的哈希值并将其一同发送;接收方可以重新计算接收到的 数据的哈希值,并与接 数据的哈希值,并与接收到的哈希值进行比较。如果两者匹配,那么数据就被视为完整的。 对于密码学的相关应用,哈希算法需要满足更高的安全标准,以防止从哈希值推导出原始密码等逆向工程, 包括: ‧ 抗碰撞性:应当极其困难找到两个不同的输入,使得它们的哈希值相同。 ‧ 雪崩效应:输入的微小变化应当导致输出的显著且不可预测的变化。 请注意,“均匀分布”与“抗碰撞性”是两个独立的概念,满足均匀分布不一定满足抗碰撞性。例如,在随机0 码力 | 343 页 | 27.39 MB | 1 年前3
《深入浅出MFC》2/ejjhou@ccca.nctu.edu.tw FAX 886-3-5733976 7 第一版序 有一种软件名曰version control,用来记录程序开发过程中的各种版本,以应不时之需,可以 随时反省、检查、回复过去努力的轨迹。 遗憾的是人的大脑没有version control 的能力。学习过程的彷徨犹豫、挫折困顿、在日积月 累的渐悟或x那之间的顿悟之后,彷佛都成了遥远模糊的回忆;而屡起屡仆、大惑不解的地 (Dialog Data eXchange)的目的在简化应用 程序取得控制组件内容的过程,DDV(Dialog Data Validation)的目的则在加强应用 程序对控制组件内容之数值合理化检查。 Scribble Step4-加强显示能力- 滚动条与分裂窗口(第11 章):Scribble 可以 对同一份Document 产生一个以上的Views,但有一个缺点亟待克服,那就是 你在窗口A的绘图动作不能实时影响窗口B 例如JBACKUP g: 而目前g: 是g:\u002\doc 那么相当于把g:\u002\doc 备份到k:\u002\doc 中,并杀掉k:\u002\doc 的赘余文件。 JBACK 检查SrcDir 中所有的文件和DstDir 中所有的文件,把比较新的文件从SrcDir 中拷贝到DstDir 去,并把DstDir 中多出来的文件删除,使ScrDir 和DstDir 的文件保 330 码力 | 1009 页 | 11.08 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 05 C++11 开始的多线程编程set_value() 不接受参数,仅仅作为同步用, 不传递任何实际的值。 第 3 章:互斥量 多线程打架案例 • 两个线程试图往同一个数组里推数据。 • 奔溃了!为什么? • vector 不是多线程安全( MT-safe )的容 器。 • 多个线程同时访问同一个 vector 会出现 数据竞争( data-race )现象。 std::mutex :上锁,防止多个线程同时进入某一代码段 • ,如果没有释放,则调用 unlock() ,否则 不调用。 • 然后可以直接调用 unique_lock 的 unlock() 函 数来提前解锁,但是即使忘记解锁也没关系, 退出作用域时候他还会自动检查一遍要不要解 锁。 std::unique_lock :用 std::defer_lock 作为参数 • std::unique_lock 的构造函数还可以有一 个额外参数,那就是 std::defer_lock 里的 unlock() 永远得不到调用。 解决 1 : other 里不要再上锁 • 遇到这种情况最好是把 other 里的 lock() 去掉,并在其文档中说明:“ other 不是线 程安全的,调用本函数之前需要保证某 mutex 已经上锁。” 解决 2 :改用 std::recursive_mutex • 如果实在不能改的话,可以用 std::recursive_mutex0 码力 | 79 页 | 14.11 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串// 超级追求性能的极客 c_str 和 data 的区别 • const char * 可以隐式转换为 string (为了方便) • string 不可以隐式转换为 const char * (安全起见) • 如果确实需要从 string 转换为 const char * ,请调用 .c_str() 这个成员函数 。 字符串的连接( + 运算符) • C 语言规定,双引号包裹的字符串是 const 才行。 • 可以用 string(“hello”) 这种形式包裹住每个字符串常量,这样就方便用 + 了 。 • 初学者建议每个字符串都用 string(“...”) 这种形式写, C 语言字符串不安全。 • “hello” + “world” // 错误 • string(“hello”) + “world” // 正确 正确: C++14 新特性:自定义字面量后缀 • 不少同学就觉得这样好麻烦,其他语言都是直接 “ hello” 就是字符串类 型, C++ 还得套一层壳 string(“hello”) 才能变成安全封装的类型,才能用他 的成员函数。 • 因此, C++14 引入了一项缓解“键盘压力”的新特性: • 写 “ hello”_s 就相当于写 operator“”_s(“hello”, 5) ,就相当于0 码力 | 162 页 | 40.20 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南CMakeLists.txt 最开头写一行: • set(Qt5_DIR ”/opt/Qt5.12.1/lib/cmake/Qt5”) # 一定要加在最前面! 三种方案利弊分析 • 单次有效(通过命令行)最安全,小彭老师高度推荐。 • 全局有效(添加环境变量)可能影响以后其他项目。比如你 A 项目依赖 Qt5.12.1 ,你设置了环 境变量 Qt5_DIR=/opt/Qt5.12.1 ,后来又搞了个 B 怎么办? • A: 你漏了上面的 2 。 • Q: 我明明编译都通过了,链接却报错“ undefined symbol : XXXfunc” 怎么办? • A: 你漏了上面的 1 。 • 打印检查一下这两个变量是不是空的: message(“!!!!!!” ${XXX_INCLUDE_DIRS}) • 如果为空说明你变量名打错了, CMake 特色就是找不到变量不报错,而是视为空字符串。0 码力 | 56 页 | 6.87 MB | 1 年前3
共 24 条
- 1
- 2
- 3













