现代C++ 教程:高速上手C++11/14/17/20. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 泛型 Lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3 平台上不再依赖于系统底层的 API,实现了语言层面的跨 平台支持;std::regex 提供了完整的正则表达式支持等等。C++98 已经被实践证明了是一种非常成功 的『范型』,而现代 C++ 的出现,则进一步推动这种范型,让 C++ 成为系统程序设计和库开发更好的 语言。Concept 提供了对模板参数编译期的检查,进一步增强了语言整体的可用性。 总而言之,我们作为 C++ 的拥护与实践者 C++ 中使用一些 C 语言代码(甚至古老的 C 语言代 码),例如 Linux 系统调用。在现代 C++ 出现之前,大部分人当谈及『C 与 C++ 的区别是什么』时, 普遍除了回答面向对象的类特性、泛型编程的模板特性外,就没有其他的看法了,甚至直接回答『差不 多』,也是大有人在。图 1.2 中的韦恩图大致上回答了 C 和 C++ 相关的兼容情况。 从现在开始,你的脑子里应该树立『C++ 不是 C0 码力 | 83 页 | 2.42 MB | 1 年前3
Hello 算法 1.2.0 繁体中文 C++ 版3.1 資料結構分類 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.2 基本資料型別 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.3 數字編碼 * . . . . 讀者物件 若你是演算法初學者,從未接觸過演算法,或者已經有一些刷題經驗,對資料結構與演算法有模糊的認識, 在會與不會之間反覆橫跳,那麼本書正是為你量身定製的! 如果你已經積累一定的刷題量,熟悉大部分題型,那麼本書可助你回顧與梳理演算法知識體系,倉庫源程式 碼可以當作“刷題工具庫”或“演算法字典”來使用。 若你是演算法“大神”,我們期待收到你的寶貴建議,或者一起參與創作。 前置條件 你需要至少 本書的主要內容如圖 0‑1 所示。 ‧ 複雜度分析:資料結構和演算法的評價維度與方法。時間複雜度和空間複雜度的推算方法、常見型別、 示例等。 ‧ 資料結構:基本資料型別和資料結構的分類方法。陣列、鏈結串列、堆疊、佇列、雜湊表、樹、堆積、 圖等資料結構的定義、優缺點、常用操作、常見型別、典型應用、實現方法等。 ‧ 演算法:搜尋、排序、分治、回溯、動態規劃、貪婪等演算法的定義、優缺點、效率、應用場景、解題0 码力 | 379 页 | 18.79 MB | 10 月前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针fabsf(float x); • 这样就没有转换成 double 的开销了。 • 此外, 3.14 也最好改成 3.14f 。因为 3.14 是 double 类型的常量, 3.14f 才是 float 类 型的常量。 std::abs 函数:自动根据参数类型判断要使用的重载 • 在 C++ 中可以用 std::abs 替代 abs ,这个 在 std 命名空间中的版本是带有多种重载的。 • 建议别用全局的任何函数( 来分配动态数组。 • ( 类型 *)malloc( 数组长度 * sizeof( 类型 )) • new 类型 [ 数组长度 ] • 可见 C++ 版本更加简洁了,不需要乘以 sizeof( 类 型 ) 。 • 不过要注意释放的时候必须用 delete[] 而不是普通的 delete ,这个方括号不能省略! 如果想要的是任意类型的数组呢? • 规则: • 使用 malloc 分配的请用 string 容器 • 如果你搞不懂 C 语言硬核的 0 结尾字符 串,但还是害怕会发生内存越界的错误。 • 可以用 C++ 封装好的 string 容器和 cin 标准输入流。 cin 支持泛型, string 支持 自动扩容,符合 RAII 思想,可以避免小 白程序员犯错。 常见错误:以为是值比较,其实是指针比较 • 要记住:指针的 == 运算比较的是地址是 否相等,而字符串的本质是字符数组0 码力 | 128 页 | 2.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串)还是整数( %d )还是 字符( %c ),必须和右边的参数一致,初学者容易搞错 。 • 而且即使搞错了也能正常编译通过(一些高级的编译器会 给出警告),但是运行结果不对,或者还有可能崩溃。 泛型的 iostream 应运而生 • 得益于 C++ 的重载技术, cout 不用你手动指定类型,他 会自动识别参数的类型,帮你调用相应的格式化函数。 c_str 和 data 的区别 • s 正确(推荐) 字符串的连接( + 运算符) • 错误: • 正确: C++14 新特性:自定义字面量后缀 • 不少同学就觉得这样好麻烦,其他语言都是直接 “ hello” 就是字符串类 型, C++ 还得套一层壳 string(“hello”) 才能变成安全封装的类型,才能用他 的成员函数。 • 因此, C++14 引入了一项缓解“键盘压力”的新特性: • 写 “ hello”_s mylib::String 重载个 + 运算符,和标准库的 std::string 其实是同等 地位的。 • 虽然也可以给 std::string 定义很多个不同的 + 重载,每个针对不同的数字类 型( int 、 float 、 double )排列组合,但是这样没有可扩展性,而且影响编 译速度。 • 所以 cpp 说,你必须手动把 42 先转换为字符串,然后再和已有的字符串相 加: • “you0 码力 | 162 页 | 40.20 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 https://www.boost.org/doc/libs/1_55_0/doc/html/ boost_typeerasure.html 类型擦除利用的是 C++ 模板的惰性实例化, Java 的泛型是做不到滴 • 由于 C++ 模板惰性编译的特性,这个擦除掉的表达式会在你实例化 AnimalWrapper的时候 自动对 T 进行编译。这意味着如果你给他一个不具有一个名为 speak 0 码力 | 54 页 | 3.94 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器这样只会按字符串指针的地址去判断相等, 而不是所指向字符串的内容。 set 的排序:自定义排序函数 • set 作为模板类,其实有两 个模板参数: set• 第一个 T 是容器内元素的类 型,例如 int 或 string 等。 • 第二个 CompT 定义了你想 要的比较函子, set 内部会 调用这个函数来决定怎么排 序。 • 如果 CompT 不指定,默认 会直接用运算符 < int 类型,表示 集合中相等元素的个数。 • 等等,不是说 set 具有去重的功能,不会 有重复的元素吗?为什么标准库让 count 计算个数而不是直接返回 bool… 因为他们 考虑到接口的泛用性,毕竟 multiset 就不 去重。对于能去重的 set , count 只可能 返回 0 或 1 。 • 个数为 0 就说明集合中没有该元素。 个数为 1 就说明集合中存在该元素 。 • 0 码力 | 83 页 | 10.23 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程(managed) 上分配。 • 实际上这种“骗”来魔改类内部行为的操作,正是现代 C++ 的 concept 思想所在。因此替换 allocator 实际上是标准库允许的 ,因为他提升了标准库的泛用性。 进一步:避免初始化为 0 • vector 在初始化的时候(或是之后 resize 的时候)会调用所 有元素的无参构造函数,对 int 类型来说就是零初始化。然而 这个初始化会是在 CPU0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vectorvector 容器:构造函数和 size • vector 可以在构造时指定初始长度。 • explicit vector(size_t n); • 例如,要创建一个长度为 4 的 int 型数组 : • vectora(4); • 之后可以通过 a.size() 获得数组的长度。 • 比如右边这段代码会得到 4 。 • size_t size() const noexcept; vector(initializer_list list); • explicit vector(size_t n); vector 容器 • 添加一个运算符重载用于打印 vector 类 型。 vector 容器:构造函数 • vector 的这个显式构造函数,默认会把所有元 素都初始化为 0 (不必手动去 memset )。 • 如果是其他自定义类,则会调用元素的默认构造 函数(例如:数字类型会初始化为 如果要把右边这个打印的操作封装起来, 该怎么做? • 可以用一个函数来封装打印操作: • print(vector const &a); • 但是这样的缺点是他只能打印 vector 类 型,没法打印 string 类型。要支持 string 只能再写一遍一样的 print 函数。 迭代器模式 • 注意到 vector 和 string 的底层都是连续 的稠密数组,他们都有 data() 0 码力 | 90 页 | 4.93 MB | 1 年前3
《深入浅出MFC》2/e有一个程度的了解后再去看侯sir 写的深入 浅出MFC... 保证让你功力大增~~ Rosario.bbs@bbs.ntu.edu.tw:深入浅出MFC 这本比较好~~~不过之前最好买侯老师的多 型与虚拟拟,把C++ 弄清楚。最后看起深入Visual C++ 就会吸收很快。 请问,想要从DOS 跨足到Windows 程序设计有哪些书值得推荐呢? hschin.bbs@bbs.cs.nthu.edu 談封裝(encapsulation) / 056 基礎類別與衍生類別 - 談繼承(Inheritance)/ 057 this 指標 / 061 虛擬函式與多型(Polymorphism) / 062 類別與物件大解剖 / 077 Object slicing 與虛擬函式 / 082 靜態成員(變數與函式) C++ 程式的生與死:兼談建構式與解構式 / 088 * ㆕種不同的物件生存方式 / 090 * 所謂 "Unwinding" / 092 執行時期型別資訊(RTTI) / 092 動態生成(Dynamic Creation) / 095 異常處理(Exception Handling) / 0960 码力 | 1009 页 | 11.08 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅提示:老师的电脑是 6 个物理核心, 12 个逻辑核心。 • 似乎这里 reduce 的加速比是逻辑核心数量,而 for 的加速比是物理核心的数量? • 剧透:因为本例中 reduce 是内存密集型, for 是计算密集型。 • 超线程对 reduce 这种只用了简单的加法,瓶颈在内存的算法起了作用。 • 而本例中 for 部分用了 std::sin ,需要做大量数学运算,因此瓶颈在 ALU 。 • lambda 体内 r 的 begin 和 end 也会返回 tbb::concurrent_vector 的迭代 器类型。 • 第一个 tbb::blocked_range 尖括号里的类 型可以省略是因为 C++17 的 CTAD 特 性。第二个则是用了 decltype 自动推导 ,也可以 (auto r) ,这里写具体类型仅为 教学目的。 TBB 中其他并发容器 第 7 章:并行筛选0 码力 | 116 页 | 15.85 MB | 1 年前3
共 20 条
- 1
- 2













