- 内容提要
- 前言
- 第 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 复习题答案
G.1 STL 和 C++11
C++11 对 C++语言做了大量修改,本书无法全面介绍,同样 C++11 对 STL 也做了大量修改,本附录无法全面介绍。然而,可以对新增的内容做一总结。
C++11 给 STL 新增了多个元素。首先,它新增了多个容器;其次,给旧容器新增了多项功能;第三,在算法系列中新增了一些模板函数。本附录介绍了所有这些变化,对前两类变化有大致了解将很有帮助。
G.1.1 新增的容器
C++11 新增了如下容器:array、forward_list、unordered_st 以及无序关联容器 unordered_multiset、unordered_map 和 unordered_multimap。
array 容器一旦声明,其长度就是固定的,它使用静态(栈)内存,而不是动态分配的内存。提供它旨在替代数组;array 受到的限制比 vector 多,但效率更高。
容器 list 是一种双向链表,除两端的节点外,每个节点都链接到它前面和后面的节点。forward_list 是一种单向链表,除最后一个节点外,每个节点都链接到下一个节点。相对于 list,它更紧凑,但受到的限制更多。
与 set 和其他关联容器一样,无序关联容器让您能够使用键快速检索数据,差别在于关联容器使用的底层数据结构为树,而无序关联容器使用的是哈希表。
G.1.2 对 C++98 容器所做的修改
C++11 对容器类的方法做了三项主要修改。
首先,新增的右值引用使得能够给容器提供移动语义(参见第 18 章)。因此,STL 现在给容器提供了移动构造函数和移动赋值运算符,这些方法将右值引用作为参数。
其次,由于新增了模板类 initilizer_list(参见第 18 章),因此新增了将 initilizer_list 作为参数的构造函数和赋值运算符。这使得可以编写类似于下面的代码:
第三,新增的可变参数模板(variadic template)和函数参数包(parameter pack)使得可以提供就地创建(emplacement)方法。这意味着什么呢?与移动语义一样,就地创建旨在提高效率。请看下面的代码段:
调用 insert( ) 将导致内存分配函数在 vt 末尾创建一个默认 Items 对象。接下来,构造函数 Items( ) 创建一个临时 Items 对象,该对象被复制到 vt 的开头,然后被删除。在 C++11 中,您可以这样做:
方法 emplace_back( ) 是一个可变参数模板,将一个函数参数包作为参数:
上述三个实参(8.2、2.8 和 3)将被封装到参数 args 中。参数 args 被传递给内存分配函数,而内存分配函数将其展开,并使用接受三个参数的 Items 构造函数(#2),而不是默认构造函数(#1)。也就是说,它使用 Items(args…),这里将展开为 Items(8.2, 2.8, 3)。因此,将在矢量中就地创建所需的对象,而不是创建一个临时对象,再将其复制到矢量中。
STL 在多个就地创建方法中使用了这种技术。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论