STL的vector中resize()和reserve的区别 resize()和reserve()这两个成员函数都是Vector的公有成员函数 在分析这两个函数区别之前先得清楚capacity和size的含义: 容量:即capacity,是指容器在自由内存中获得了多大的存储空间,不一定使用完; 大小:即size,指的是容器中实际元素的个数,表示你已经存在的元素的个数 1. reserve() void reserve(size_type n); reserve()中的参数n改变的是总空间(_capacity)的大小;(注意:他开辟出来的n 个空间并不代表就都是有效空间,只有size()大小的空间才是有效空间) 它的函数原型是这样的: 对于n值的大小,分两种情况: (1)如果n大于容器现有的容量(capacity),比如你容器原来是100的容量,我现在指定n=200,那么就需要在自由内存区为整个容器重新分配一块新的更大的连续空间【因为vector是顺序容器,所以存储空间是连续的,如果之前的存储空间不够了,必须这样做】,然后将容器内所有的有效元素从旧位置全部复制到新位置,这个过程是调用拷贝构造函数,然后释放旧位置的所有存储空间,并调整容器的元素位置指示器。所以reserve的时候如果n比原来的大,结果只是让容器的冗余容量(即没有分配元素的存储区)变大,容器的实际大小,即元素个数并没有改变。 (2)如果n小于容器原来的容量,那么这个函数什么作用都没有。相当于白调用了。 2. resize()
它的函数原型是这样的:
void resize(size_type n, const T& c = T()); 其中n是要保留的元素个数,代表的是当前要申请的有效元素的个数;如果是要新增元素的话,c则是新增元素的默认初始值。默认为T()(T()表示当T为什么类型时,c就是什么类型的默认值eg:T为int 则:T()为0,T为char 则:T()为‘\0’))
对于n值的大小,分三种情况:
(1)如果n大于容器当前的大小(即容器的size),则在容器的末尾插入n-size()个初始值为c的元素;如果没有指定初始值,那就元素类型的默认构造函数来初始化。
(2)如果n小于容器当前的大小,则删除末尾的size()-n个元素,这样就导致容器的大小变了,size 变小了。但是这种类型的容器在删除一个元素的时候并不会释放元素本身的内存空间【这也是为了保留这块空间以避免将来要插入新元素的时候又要进行存储空间重分配】,所以容器的容量即capacity其实是没有改变的。
(3)n等于容器当前的大小,则什么也不做。 显然,reserve和resize的共同点就是:都不缩减容器本身的容量。即对内存空间并没有影响。那么要是当你觉得容器的容量太多的时候,应该如何缩减容量呢。这时候需要用到一个利用swap函数的技巧。
list中没有reserve()和capacity(),但是有resize();
转载:https://www.cnblogs.com/dengwuxie/p/7275101.html