《21天学通C++(第7版)》——17.3 理解大小和容量

简介:

本节书摘来自异步社区出版社《21天学通C++(第7版)》一书中的第17章,第17.3节,作者: 【美】Siddhartha Rao, 【德】Nicolai M. Josuttis,更多章节内容可以访问云栖社区“异步社区”公众号查看。

17.3 理解大小和容量

21天学通C++(第7版)
vector的大小指的是实际存储的元素数,而vector的容量指的是在重新分配内存以存储更多元素前vector能够存储的元素数。因此,vector的大小小于或等于容量。

要查询vector当前存储的元素数,可调用size():
image

要查询vector的容量,可调用capacity():
image

如果vector需要频繁地给其内部动态数组重新分配内存,将对性能造成一定的影响。在很大程度上说,这种问题可以通过使用成员函数reserve (number)来解决。reserve函数的功能基本上是增加分配给内部数组的内存,以免频繁地重新分配内存。通过减少重新分配内存的次数,还可减少复制对象的时间,从而提高性能,这取决于存储在vector中的对象类型。程序清单17.7说明了size()和capacity()之间的区别。

程序清单17.7 演示size()和capacity()
image

输出:
image

分析:
第8行实例化了一个包含5个整型对象的vector,这些整型对象使用默认值0。第11行和第12行分别显示vector的大小和容量,它们在实例化后相等。第15行在vector中插入了第6个元素。鉴于在插入前vector的容量为5,因此vector的内部缓冲区没有足够的内存来存储第6个元素。换句话说,vector为扩大其容量以存储6个元素,需要重新分配内部缓冲区。重新分配的逻辑实现是智能的:为避免插入下一个元素时再次重新分配,提前分配了比当前需求更大的容量。

从输出可知,在容量为5的vector中插入第6个元素时,将容量增大到了7。size()总是指出vector存储的元素数,当前其值为6。第22行插入了第7个元素,这次没有扩大容量,因为已分配的内存足以满足需求。这时大小和容量相等,这表明vector的容量已经用完,再次插入元素将导致vector重新分配其内部缓冲区、复制现有的元素再插入新值。

在重新分配vector内部缓冲区时提前增加容量方面,C++标准没有做任何规定,这取决于使用的STL实现。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
2月前
|
存储 算法 C++
【C/C++ Vector容量调整】理解C++ Vector:Reserve与Resize的区别与应用
【C/C++ Vector容量调整】理解C++ Vector:Reserve与Resize的区别与应用
69 1
|
7天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
16 0
|
8天前
|
C语言 C++
【C++】string类(常用接口)
【C++】string类(常用接口)
21 1
|
5天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1
|
5天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
13 0
|
5天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
15 0
【C++】string学习 — 手搓string类项目
|
6天前
|
Java C++ Python
【C++从练气到飞升】06---重识类和对象(二)
【C++从练气到飞升】06---重识类和对象(二)
|
6天前
|
编译器 C++
【C++从练气到飞升】06---重识类和对象(一)
【C++从练气到飞升】06---重识类和对象(一)