返回介绍

G.1 STL 和 C++11

发布于 2024-10-08 23:14:17 字数 1815 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文