本节书摘来自异步社区出版社《21天学通C++(第7版)》一书中的第17章,第17.3节,作者: 【美】Siddhartha Rao, 【德】Nicolai M. Josuttis,更多章节内容可以访问云栖社区“异步社区”公众号查看。
17.3 理解大小和容量
21天学通C++(第7版)
vector的大小指的是实际存储的元素数,而vector的容量指的是在重新分配内存以存储更多元素前vector能够存储的元素数。因此,vector的大小小于或等于容量。
要查询vector当前存储的元素数,可调用size():
要查询vector的容量,可调用capacity():
如果vector需要频繁地给其内部动态数组重新分配内存,将对性能造成一定的影响。在很大程度上说,这种问题可以通过使用成员函数reserve (number)来解决。reserve函数的功能基本上是增加分配给内部数组的内存,以免频繁地重新分配内存。通过减少重新分配内存的次数,还可减少复制对象的时间,从而提高性能,这取决于存储在vector中的对象类型。程序清单17.7说明了size()和capacity()之间的区别。
程序清单17.7 演示size()和capacity()
输出:
分析:
第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实现。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。