vector扩张
vector是本书中,也是实际编程中用得比较多的一种容器。我们之前都只是把vector当成数组来看待,但其实vector是一种动态的数据结构。我们知道数组的容量在声明的时候就是确定的,而动态数组的容量虽然在运行时才指定,但分配完后也就不能修改了,除非释放内存后重新分配。vector在底层实现动态数组其实也类似于这种方式,在初始容量占满之后就会重新分配更大的空间,然后将原有的元素复制过去,释放原来的空间,这样我们就可以一直使用push_back()添加元素却永远不会满了。但其实在底层,vector使用的空间就已经开始暗中变化了,而且不是一点一点地增加。了解到这一点之后,我们就知道添加元素也会导致迭代器失效。
接下来我们看一看vector的容量是怎么随着元素的添加而变化的。
动手写12.11.1
动手写12.11.1展示了vector的容量是怎么随着元素的增多而增加的,运行结果如图12.11.1所示:
图12.11.1 vector扩容(www.xing528.com)
我们可以发现,在每次添加元素的时候,vector的容量不是线性增加的。vector的元素越多,容量一次性增长就越快。动态增长大小的确定与内存cache的相关知识有关,在这里就不做详细介绍了。
除了等待容器满了以后自己触发容量扩张,在知道了vector可能使用的最大容量的时候,我们也可以使用reserve()函数手动指定vector的容量。
动手写12.11.2
动手写12.11.2展示了reserve()函数的用法,运行结果如图12.11.2所示:
图12.11.2 reserve()函数
我们可以看到,程序在已知vector最多可能存放的元素个数的情况下预先分配了大小为10的空间,随后在添加元素的时候,vector的大小一直没有超过这个容量,因此不需要重新分配内存。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。