31.4 容器

本节继续深入讨论一些细节:

·vector及其构造函数(见31.4.1节)。

·链表:list和forward_list(见31.4.2节)。

·关联容器,如map和unordered_map(见31.4.3节)。

31.4.1 vector

STL的vector是默认容器——除非你有充分理由,否则应该使用它。如果你希望使用链表或内置数组替代vector,应慎重考虑后再做决定。

31.3节介绍了vector上的操作,并隐含地与其他容器上的操作进行了对比。但是,在了解了vector的重要性之后,本节继续深入讨论它,重点介绍其操作是如何实现的。

vector的模板参数和成员类型定义如下:

31.4.1.1 vector和增长

考虑一个vector对象的内存布局(如13.6节所述):

使用大小(元素数目)和容量(不重新分配空间的前提下可容纳的元素数目)令push_back()操作时的向量增长相当高效:不会在添加每个元素时都分配内存,而是在超出容量时才进行一次重新分配(见13.6节)。C++标准并未指定超出容量时向量的增长幅度,但很多C++实现都是增加大小的一半。曾经有一段时间,当读取输入存入一个vector时,我总是注意使用reserve()。但我惊讶地发现,基本上所有情况下,调用reserve()都不会带来可测量的性能变化。默认的增长策略与我自己预测分配做得一样好,因此我就停止使用reserve()来提高性能了。取而代之,我用它来提高重分配延迟的可预测性以及避免指针和迭代器失效。 ...

Get C++程序设计语言(第4部分:标准库)(原书第4版) now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.