STL方法中,resize()和reserve()的区别和用途

来源:互联网 发布:java中重写和重载 编辑:程序博客网 时间:2024/06/05 01:53

之前对二者用法总是混淆,所以花时间仔细研究了一下,并在vs2013下测试了一些简单的vector<int>的例子,总结如下:

resize():改变当前容器内含有元素的数量(size()),eg: vector<int>v; v.resize(len);v的size变为len,如果原来v的size小于len,那么容器新增(len-size)个元素,元素的值为默认为0.当v.push_back(3);之后,则是3是放在了v的末尾,即下标为len,此时容器是size为len+1;

reserve():改变当前容器的最大容量(capacity),它不会生成元素,只是确定这个容器允许放入多少对象,如果reserve(len)的值大于当前的capacity(),那么会重新分配一块能存len个对象的空间,然后把之前v.size()个对象通过copy construtor复制过来,销毁之前的内存;

只有当容器内元素数(size)大于capcity时,容器才会改变地址。

 

vector<int> v;

当v.resize(len)中len>v.capacity(),则v中的size和capacity均设置为len;

当v.resize(len) 中len<=v.capacity(),则v中的size设置为len,而capacity不变; 如果此时len<v.size(),那么多出的那些对象(v[len], v[len+1]…)会被销毁,v[0]-v[len-1]仍保留在原地。

当v.reserve(len)中len>v.capacity(),则v中的capacity变为len,size不变,size只跟容器中元素数和resize有关(v.resize(len)将原来不存在的元素设为初值0)。

当v.reserve(len)中len<=v.capacity(),则v中的capacity不变,size不变,即不对容器做任何改变。

总结:size可能改变capacity,但capacity不会改变size;

原创粉丝点击