- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
16.8 总结
C++提供了一组功能强大的库,这些库提供了很多常见编程问题的解决方案以及简化其他问题的工具。string 类为将字符串作为对象来处理提供了一种方便的方法。string 类提供了自动内存管理功能以及众多处理字符串的方法和函数。例如,这些方法和函数让您能够合并字符串、将一个字符串插入到另一个字符串中、反转字符串、在字符串中搜索字符或子字符串以及执行输入和输出操作。
诸如 auto_ptr 以及 C++11 新增的 shared_ptr 和 unique_ptr 等智能指针模板使得管理由 new 分配的内存更容易。如果使用这些智能指针(而不是常规指针)来保存 new 返回的地址,则不必在以后使用删除运算符。智能指针对象过期时,其析构函数将自动调用 delete 运算符。
STL 是一个容器类模板、迭代器类模板、函数对象模板和算法函数模板的集合,它们的设计是一致的,都是基于泛型编程原则的。算法通过使用模板,从而独立于所存储的对象的类型;通过使用迭代器接口,从而独立于容器的类型。迭代器是广义指针。
STL 使用术语“概念”来描述一组要求。例如,正向迭代器的概念包含这样的要求,即正向迭代器能够被解除引用,以便读写,同时能够被递增。概念真正的实现方式被称为概念的“模型”。例如,正向迭代器概念可以是常规指针或导航链表的对象。基于其他概念的概念叫作“改进”。例如,双向迭代器是正向迭代器概念的改进。
诸如 vector 和 set 等容器类是容器概念(如容器、序列和关联容器)的模型。STL 定义了多种容器类模板:vector、deque、list、set、multiset、map、multimap 和 bitset;还定义了适配器类模板 queue、priority_queue 和 stack;这些类让底层容器类能够提供适配器类模板名称所建议的特性接口。因此,stack 虽然在默认情况下是基于 vector 的,但仍只允许在栈顶进行插入和删除。C++11 新增了 forward_list、unordered_set、unordered_multiset、unordered_map 和 unordered_multimap。
有些算法被表示为容器类方法,但大量算法都被表示为通用的、非成员函数,这是通过将迭代器作为容器和算法之间的接口得以实现的。这种方法的一个优点是:只需一个诸如 for_each( ) 或 copy( ) 这样的函数,而不必为每种容器提供一个版本;另一个优点是:STL 算法可用于非 STL 容器,如常规数组、string 对象、array 对象以及您设计的秉承 STL 迭代器和容器规则的任何类。
容器和算法都是由其提供或需要的迭代器类型表征的。应当检查容器是否具备支持算法要求的迭代器概念。例如,for_each( ) 算法使用一个输入迭代器,所有的 STL 容器类类型都满足其最低要求;而 sort( ) 则要求随机访问迭代器,并非所有的容器类都支持这种迭代器。如果容器类不能满足特定算法的要求,则可能提供一个专用的方法。例如,list 类包含一个基于双向迭代器的 sort( ) 方法,因此它可以使用该方法,而不是通用函数。
STL 还提供了函数对象(函数符),函数对象是重载了( ) 运算符(即定义了 operator( )( ) 方法)的类。可以使用函数表示法来调用这种类的对象,同时可以携带额外的信息。自适应函数符有 typedef 语句,这种语句标识了函数符的参数类型和返回类型。这些信息可供其他组件(如函数适配器)使用。
通过表示常用的容器类型,并提供各种使用高效算法实现的常用操作(全部是通用的方式实现的),STL 提供了一个非常好的可重用代码源。可以直接使用 STL 工具来解决编程问题,也可以把它们作为基本部件,来构建所需的解决方案。
模板类 complex 和 valarray 支持复数和数组的数值运算。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论