首先,从二者的名字上可以看出区别:
reserve(): serve 是“保留”的词根,所以是用来预留容量的,并不会改变容器的有效元素个数。即用reserve()开辟空间时,仅改变capacity大小,与size无关。
resize(): size 是“大小”的意思,它主要用来调整容器有效元素的个数,有时候也会造成容量的改变。因此用resize()开辟空间时,会对增加的空间全部进行初始化,使得有效元素个数增加。
解释两个概念:
容量(capacity): 指容器在自由内存中获得存储空间的大小,容量为100时并不代表有100个元素,可能有效元素只有10个,剩下的90个都是闲置的未定义的内存空间。
大小(size): 指的是容器中实际(有效)元素的个数,当大小为100时,就代表容器中已存在100个元素,容量一定不小于100。
reserve( ) 和resize( ) 函数:
1. reserve( )
通过查看vector的reserve()文档,了解到它的函数原型如下:
void reserve( size_type n) ;
1)如果n值大于容器现有容量(即capacity),那么就在自由内存空间为整个容器重新分配一块更大的连续空间【因为vector是顺序容器,所以存储空间一定是连续的】,然后将容器内所有的有效元素从旧空间的位置全部复制到新空间相应的位置,然后释放旧空间,并调整容器的元素位置指示器。所以reserve函数的结果只是让容器的冗余容量变大,容器的实际大小即元素个数并没有变化。
2)如果n值小于容器的现有容量,那么这个函数没有任何作用。
总之,调用reverse永远不会减少容器占用的内存空间。
2.resize(n)
调整容器的大小为n个元素,若n<容器.size(),则多出的元素被丢弃(逻辑上的丢弃,因为还是能够访问到)。若容器.capacity()>n>容器.size(),则需要添加新元素至n个,并对新元素进行默认初始化。若n>容器.capacity(),则会先将容器的容量进行扩充,再添加新元素至n个,并默认初始化。
即,resize既能改变容器的现有元素个数,也可能改变容器的现有容量。