出版时间:2013-6 出版社:机械工业出版社 作者:温宇杰
Tag标签:无
前言
前 言为什么要写这本书 笔者在工作中最常用的编程语言就是C++。在最初接触C++语言的时候,只当它是C语言与面向对象编程的组合,在写代码时也是积极实践“万物皆对象”的法则,不管什么操作,总要将其在某个对象的某个成员函数中实现才满意。但在长年的编程实践过程中,却常常对面向对象的设计方法产生怀疑。 面向对象的设计思想,是将与某个数据类型相关的操作与该数据类型捆绑在一起,构成一个整体。然而,有时候操作并不完全依赖于数据类型。同一种算法,可能适用于不同的数据类型。如果硬要遵循“万物皆对象”的法则,那么只能将其在各个具体数据类型中重复实现,或是设计一个抽象的类型专门容纳算法。无论怎样,总显得有些“削足适履”。 而在实践中最苦恼的事情是,虽然算法固定,但是只因数据结构不同,每当引入新数据时,只得将算法重写一遍,徒费人工。高手看到此,自然就会想到将算法写成模板。也正因有此困扰,笔者才开始正视C++语言中的“模板编程”,一旦走入这套精密强力却又不广为人知的机制,方知此处别有洞天。 几番研究与实践下来,笔者尚不敢称对C++的模板编程掌握几分,却早已叹于其对笔者编程思路革新起到巨大的帮助。从“万物皆对象”,到如今渐渐变为关注设计容器及抽象算法,这是拜模板所赐。赞叹之余,不禁想尝试写一本书介绍C++中的模板编程,于人分享心得,于己则巩固琢磨。不论章节条理,只求娓娓道来。如能对读者略有裨益,便是幸甚。读者对象 本书假定读者对C++的语法有基本了解,要求仅此而已。笔者尽力将C++语言中这一部分非常有趣的内容,用详尽的示例以及平实的语言展现在读者面前。即使是刚刚踏入C++队伍的新兵,相信也能跟随本书的进度,渐渐领略这一片C++秘境。而对于久经沙场的老兵,笔者限于自身阅历有限,不敢夸口定能有所提高,唯有以诚意将所思所得写下,请诸位老兵“择其善者从之,其不善者改之”。 本书面向了解C++基本语法并有C++编程经历的读者。对C++模板编程技术、标准模板库用法和原理感兴趣的读者,可以将本书作为一本入门与提高的书使用。对于经常开发中小型C++代码库的读者,本书中有关模板高级编程技巧的内容可为您提供有益的补充。另外,本书中有关C++11新标准与模板技术的内容,也可作为对新标准的概要介绍供您参考。如何阅读本书 本书的内容分为四个部分。 模板基础(第1~4章)介绍模板编程的基本概念与用法,并着重讨论编译器对模板的具体实现方法及其局限。学习完本部分之后,读者可以理解模板的基本原理并自行实现简单的类模板与函数模板。 标准库中的模板(第5~9章)介绍标准库中的算法与容器,并对其实现细节进行仔细推敲。算法与容器可以说是C++模板编程的最典型用法。C++程序员可以不知道模板编程技术,但不可能不用到由模板写成的标准算法与容器。了解其实现原理的重要意义不言而喻。学习完本部分,读者将能洞悉标准库容器的实现原理,对标准库中的算法、迭代器与容器之间的关系有深入的理解,从而可以精确调节标准容器的行为以及自行开发适用于标准算法的容器类模板等。 模板编程高级技巧(第10~13章)讨论模板编程中“概念”的设计、控制代码量的技术、编译期逻辑的控制以及元编程的基本方法等。学习完本部分,读者可以开发规模更大、更加智能的模板库,并利用元编程技术实现编译期的逻辑演绎与类型推导。 模板与C++11(第14~16章)介绍新标准C++11中的重要改进及其对模板编程的影响。在学习完本部分之后,读者将能够准确把握C++11的几大重要革新的用意和用法,为利用新一代标准进行软件开发打下坚实基础。勘误和支持 除封面署名外,本书编写工作的还有:陈凯、石少华、刘宏业、林文雯、王春、张敏、付强。由于笔者学识与经历有限,书中内容难免有偏颇及谬误之处。笔者将秉持谦虚的态度和开放的胸襟,认真对待各位读者的批评与指教。书中的全部源文件可以从华章网站下载,如您对本书内容有任何意见和建议,或者有关C++和程序设计的任何话题,欢迎发送邮件至yjwen.ty@qq.com和通过新浪微博@宇杰W与笔者交流。致谢 感谢我的好友张哲君。作为本书草稿的第一位读者,你的意见与鼓励是我写作本书的动力之源。 感谢机械工业出版社华章公司的各位同仁为本书的出版付出的辛勤劳动。特别要感谢杨福川编辑和白宇编辑,本书从草稿到成书的过程,离不开你们的精心指导与耐心审校。 最深深的谢意送给我的母亲和我的妻子。没有你们在我身边一直默默地支持和付出,不会有提笔写作的我,也不会有本书存在。 最美好的祝愿送给我即将出生的孩子们。愿你们快乐成长,并拥有淡定从容的人生。 最后,借此机会,向C++语言的发明者BjarneStroustrup教授、标准模板库的主要作者Alexander Stepanov和Meng Lee致以崇高的敬意。温宇杰
内容概要
C++模板编程领域的经典著作,由资深C++开发工程师撰写。本书以透彻分析原理为前提,深入讲解了模板编程的基本原理、标准库中算法与容器等模板的实现原理;以实践为导向,通过大量的模板向读者展示了如何使用模板进行编程以及如何编写自定义模板。除此之外,本书还总结了各种常用的模板编程技巧、C++11标准中的模板新特性和新语法,以及C++11中新增的其他语言特性。
全书共16章,分为四部分:第一部分(第1~4章)首先介绍了模板编程的基本概念与用法,然后重点讨论了编译器对模板的具体实现方法及其局限,读者可以通过本部分内容理解模板的基本原理并自行实现简单的类模板与函数模板。第二部分(第5~9章)对标准库中的算法与容器的实现原理和用法进行了深入地剖析,读者通过本部分内容对标准库中的算法、迭代器与容器之间的关系有深入的理解,从而可以精确调节标准容器的行为,自行开发适用于标准算法的容器类模板。第三部分(第10~13章)讨论了模板编程的高级技巧,如模板编程中“概念”的设计、控制代码量的技术、编译期逻辑的控制以及元编程的基本方法等,读者可以通过本部分内容开发更具规模、更加智能的模板库,并利用元编程技术实现编译期的逻辑演绎与类型推导。第四部分(第14~16章)介绍了C++11标准中的新增语言特性,以及对模板编程的影响。
作者简介
温宇杰 资深C++软件工程师,有多年C++开发经验,对C++模板编程和元编程有非常深入的研究,实践经验十分丰富。擅长组合优化算法及大规模集成电路辅助设计算法,对FPGA体系结构以及Verilog和VHDL等硬件描述语言也有非常深入的研究,曾主持并参与开发了一套完整设计流程的FPGA平台编译软件。
书籍目录
目 录前言第一部分 模板基础第1章 Hello模板 / 21.1 为什么需要模板 / 21.2 初识函数模板 / 31.2.1 函数模板的实现 / 31.2.2 如何使用函数模板 / 41.2.3 模板参数自动推导 / 51.2.4 模板参数默认值 / 71.2.5 模板函数的静态变量 / 81.3 如何处理函数模板中的函数体 / 81.3.1 HPP文件还是CPP文件 / 91.3.2 链接器如何识别重复模板实例 / 101.4 尴尬的Export Template / 131.4.1 什么是外名模板 / 131.4.2 C++编译器对外名模板的处理 / 141.5 本章小结 / 15第2章 类亦模板 / 162.1 类型无关的数据结构 / 162.2 实践——栈类模板 / 172.2.1 栈类模板实例 / 172.2.2 栈类模板衍生子类模板实例 / 202.3 突破——异质链表 / 212.4 构造元组 / 232.4.1 通过嵌套实现元组 / 232.4.2 用类实现元组 / 242.5 类模板的用法 / 252.5.1 成员函数模板 / 252.5.2 友元函数模板 / 262.6 类模板的静态成员 / 272.7 本章小结 / 30第3章 模板参数类型详解 / 313.1 整数模板参数 / 313.2 函数指针模板参数 / 323.3 指针及引用模板参数 / 343.4 成员函数指针模板参数 / 353.5 模板型模板参数 / 373.6 本章小结 / 39第4章 凡事总有“特例” / 404.1 从vector说起 / 404.2 特例的多种写法 / 444.3 特例匹配规则 / 464.4 函数模板的特例与重载 / 474.4.1 分辨重载 / 504.4.2 编译期的条件判断逻辑 / 524.5 本章小结 / 54第二部分 标准库中的模板第5章 容器、迭代器与算法 / 565.1 容器的定义 / 565.2 容器的实现 / 565.2.1 Java的实现方法 / 575.2.2 C++的实现方法 / 605.3 容器与迭代器 / 625.3.1 链表容器与迭代器 / 645.3.2 集合容器与迭代器 / 675.4 迭代器与算法 / 715.4.1 求容器中元素之和 / 715.4.2 实例:微型算法库 / 735.5 容器与迭代器的分类 / 755.6 容器与算法的关系 / 765.7 迭代器的陷阱 / 765.8 本章小结 / 77第6章 标准库中的容器 / 796.1 容器的分类及基本要求 / 796.2 序列型容器 / 816.2.1 变长数组vector / 826.2.2 双向链表list / 846.2.3 双端序列deque / 856.3 容器转换器 / 876.3.1 栈stack与队列queue / 876.3.2 优先队列priority_queue / 886.4 关联型容器 / 896.4.1 基本数据结构 / 896.4.2 内嵌类型定义 / 926.4.3 构造关联型容器 / 926.4.4 插入数据 / 936.4.5 数据的删除、查找与访问 / 966.4.6 整数值专用集合bitset / 986.5 散列表容器 / 996.5.1 基本数据结构 / 996.5.2 散列函数 / 1006.5.3 桶 / 1016.6 其他C++11新容器 / 1046.6.1 定长数组array / 1046.6.2 单向链表forward_list / 1056.7 本章小结 / 106第7章 隐形的助手——分配器 / 1077.1 分配器的基本要求 / 1077.2 交换容器内容时的特殊处理 / 1107.3 有态分配器与无态分配器 / 1127.4 实践:池分配器 / 1147.4.1 池分配器模板类的设计 / 1157.4.2 对象池的实现 / 1167.4.3 定位构造 / 1217.4.4 池分配器的实现 / 1227.4.5 测试池分配器 / 1277.4.6 实际运行 / 1297.5 本章小结 / 131第8章 标准库中的迭代器 / 1328.1 迭代器分类 / 1328.1.1 输入迭代器 / 1328.1.2 前向迭代器 / 1338.1.3 双向迭代器与跳转迭代器 / 1358.1.4 输出迭代器 / 1368.2 迭代器属性类模板 / 1378.3 迭代器转换器 / 1398.3.1 反转迭代器 / 1398.3.2 插入迭代器 / 1418.4 流迭代器 / 1428.5 本章小结 / 144第9章 标准库中的算法 / 1459.1 算法的共同特征 / 1459.2 标准库中的常用算法 / 1459.2.1 foreach的三种写法 / 1469.2.2 搜索 / 1479.2.3 计数与比较 / 1499.2.4 复制、交换、替换与删除 / 1499.2.5 排序 / 1519.2.6 二分搜索 / 1519.2.7 集合运算 / 1529.2.8 二叉堆操作 / 1549.2.9 其他算法 / 1549.3 预设函数对象 / 1559.3.1 函数对象基类 / 1559.3.2 运算函数对象 / 1569.3.3 参数绑定 / 1579.4 实践:矩阵操作中如何消除循环语句 / 1659.4.1 跨跃迭代器 / 1659.4.2 矩阵类模板 / 1679.4.3 累计迭代器 / 1699.4.4 矩阵乘法 / 1709.4.5 矩阵LU分解 / 1719.4.6 组合迭代器 / 1729.4.7 没有循环语句的矩阵乘法 / 1779.5 本章小结 / 178第三部分 模板编程高级技巧第10章 专用名词——概念 / 18010.1 模板的先天不足 / 18010.2 “概念”的提案及ConceptGCC编译器 / 18110.3 概念语法 / 18310.3.1 定义概念 / 18310.3.2 用概念约束模板参数 / 18410.3.3 概念映射 / 18410.4 概念模拟库 / 18610.4.1 概念检查宏 / 18710.4.2 自定义概念检查 / 18910.4.3 概念典型 / 19010.5 本章小结 / 191第11章 代码膨胀 / 19211.1 源代码的增加 / 19211.1.1 代理类的困境 / 19211.1.2 D语言的方法 / 19511.2 目标代码的增加 / 19611.2.1 目标代码膨胀的成因 / 19611.2.2 目标代码膨胀实例 / 19711.2.3 改进代码 / 19811.2.4 测试改进效果 / 20611.3 本章小结 / 208第12章 常用模板编程技巧 / 20912.1 标签与特性 / 20912.1.1 特性类模板numeric_limits / 20912.1.2 实例:矩阵与向量乘法 / 21112.2 编译期多态 / 21312.2.1 全覆盖的函数模板 / 21312.2.2 虚函数的启发 / 21312.2.3 虚基类模板 / 21412.3 策略 / 21712.3.1 策略的产生:再说vector的不足 / 21712.3.2 为vector添加存储策略 / 21812.4 伪变长参数模板 / 22312.4.1 hetero_node的启发 / 22412.4.2 编译期递归 / 22512.4.3 访问元组中的数据 / 22712.5 本章小结 / 230第13章 元编程 / 23113.1 C++中的元编程 / 23113.2 元函数 / 23113.2.1 元函数的实现 / 23113.2.2 元函数的调用 / 23313.3 元容器与元算法 / 23513.3.1 元容器的实现 / 23513.3.2 实例:容纳5种类型的元容器 / 23613.4 类型过滤 / 24013.4.1 类型过滤元函数的实现 / 24013.4.2 实例:应用元容器与元算法 / 24213.5 本章小结 / 244第四部分 模板与C++11第14章 右值引用 / 24614.1 右值引用的产生 / 24614.1.1 函数的匿名返回值 / 24614.1.2 返回值优化 / 24914.2 右值引用基本概念 / 25114.2.1 左值与非左值 / 25114.2.2 右值与右值引用 / 25214.2.3 移动构造与移动赋值 / 25214.2.4 狭义与广义的右值 / 25314.2.5 左值强制转义成右值引用 / 25414.2.6 右值引用变量是左值 / 25514.3 引用声明符消去规则 / 25614.3.1 完美转发 / 25614.3.2 实例:智能的min函数 / 26014.4 移动与异常 / 26314.4.1 迁移数据的风险 / 26314.4.2 关键字noexcept / 26514.4.3 转义函数模板 / 26714.4.4 移动的效率问题 / 26814.5 本章小结 / 269第15章 模板新语法 / 27015.1 变长参数模板 / 27015.1.1 参数包 / 27115.1.2 参数包的内容 / 27215.1.3 参数包的展开模式 / 27315.1.4 遍历参数包的内容 / 27415.1.5 轻松实现元组 / 27515.2 扩展的类型推导机制 / 27615.2.1 自动类型变量 / 27715.2.2 提取表达式结果类型 / 27815.2.3 函数后置返回类型 / 28015.3 其他模板新特性 / 28115.3.1 外部模板实例 / 28115.3.2 模板别名 / 28215.3.3 连续的右尖括号 / 28215.4 本章小结 / 283第16章 C++11新特性集锦 / 28416.1 λ表达式 / 28416.1.1 λ表达式语法 / 28416.1.2 变量捕获 / 28516.2 初值列表新用法 / 29016.2.1 构造变量 / 29016.2.2 初值封装类模板 / 29116.3 标准容器与算法的变化 / 29216.3.1 对应右值引用 / 29216.3.2 对应变长参数模板 / 29316.3.3 对应初值列表 / 29416.4 标准元组类模板 / 29416.5 智能指针 / 29616.5.1 独占指针unique_ptr / 29716.5.2 共享指针shared_ptr与weak_ptr / 29816.6 基于范围的for循环 / 29916.7 拾遗 / 30016.8 本章小结 / 301
编辑推荐
C++模板编程领域经典著作,深入讲解模板编程的基本原理、标准库中算法与容器等模板的实现原理、模板编程的高级技巧,以及C++11的模板新特性资深C++开发工程师撰写,以透彻分析原理为前提,以实践为导向,能有效指导读者动手编写各类模板
图书封面
图书标签Tags
无
评论、评分、阅读与下载