vector空间的动态增长
当我们向vector中添加元素时,如果vector空间大小不足,则会以原大小的两倍另外配置一块较大的新空间,然后将原空间的内容拷贝过来,在新空间的内容末尾添加元素,并释放原空间。
vector的空间动态增加大小,并不是在原空间之后的相邻地址增加新空间,因为vector的空间是线性连续分配的,并不能原空间之后的可供配置的空间。
因此,对vector的任何操作,一旦引起空间的重新配置,指向原vector的所有迭代器就会失效。
对于一个vector的对象,内存的分布如下图:
从上往下看:
- start迭代器指向已有空间的首元素。
- finish迭代器指向已用空间的尾元素的下一个位置。
- end_of_storage指向可用空间的末尾。
就函数而言:
- size()函数返回的是已用空间的大小。
- capacity ()函数返回的是总空间的大小。
- capacity() - size() 则是剩余的可用空间大小。
- 当size()和capacity()相等,说明vector目前的空间已经用完。如果再添加元素,就会引起vector空间的动态增长。
- resize() 成员函数只改变元素的数目,不改变vector的容量。
由于动态增长会引起动态分配内存空间、拷贝原空间、释放原空间,这些过程会降低效率。因此,可以使用reserve(n) 预先分配一块较大的指定大小的内存空间,这样当指定大小的内存空间未使用完时,是不会重新分配内存空间的。这样提升了效率,只有当n>capacity()时,调用reserve(n)才会改变vector的容量。
小结
- 空的vector对象,size()和capacity()都为0。
- 当空间大小不足时,新分配的空间大小为原先的2倍。
- 使用reserve(n)预先分配一块内存时,在空间未满的的情况下,不会引起重新分配,从而可以提高效率。
- 当reserve()分配的空间比原空间小时,是不会引起重新分配的。
- resize()函数只改变容器的元素数目,未改变容器大小。