目录
首先我们需要认清楚两个概念
capacity和size.
举一个例子,这里有半瓶1L的矿泉水。
那么1L就是我们说的容量,也就是capacity,表示指容器在内存中开辟的存储空间的总大小。
半瓶,也就是500ML,也就是size,表示已经使用的空间大小。
理解了这个之后我们下面对两个函数分别进行介绍
reserve:
一:函数原型
void reserve( size_type n) ;
1.如果n>capacity,那么就在内存空间重新分配一块更大的连续空间,然后将容器内所有的有效元素从旧空间的位置全部复制到新空间相应的位置,然后释放旧空间,指向新空间。
2.如果n值小于容器的现有容量,那么这个函数没有任何作用。
所以说:所以reserve函数的结果只是capacity变大,原本元素个数即size并没有变化。
二:举例
#include<iostream>
int main()
{
string s("123");
cout << "s原本的capacity:" << s.capacity() << endl;
cout << "s原本的size:" << s.size() << endl;
s.reserve(20);
cout << "s现在的capacity:" << s.capacity() << endl;
cout << "s现在的size:" << s.size() << endl;
return 0;
}
resize:
一:函数原型
void resize (size_type n, const T& c = T());
这里n是元素的个数,c是元素默认初始化的值。
1.如果n>size,则在容器的末尾插入n-size()个初始值为c的元素,若如果没有指定初始值,那就用元素类型的默认构造函数来初始化。这里有可能capacity变大。
2.如果n<size,则删除末尾的size()-n个元素,这样会导致size变小。但是在这种类型的容器在删除元素后并不会释放元素本身的内存空间,所以容器的容量capacity并没有改变。(一般不用这个函数进行删除操作)
3.n值等于当前容器的大小时,什么也不做。
二:举例
#include<iostream>
int main()
{
string s("123");
cout << "s原本的capacity:" << s.capacity() << endl;
cout << "s原本的size:" << s.size() << endl;
cout << s << endl;
s.resize(6);
cout << "s现在的capacity:" << s.capacity() << endl;
cout << "s现在的size:" << s.size() << endl;
cout << s << endl;
s.resize(10,'6');
cout << "s现在的capacity:" << s.capacity() << endl;
cout << "s现在的size:" << s.size() << endl;
cout << s << endl;
s.resize(2);
cout << "s现在的capacity:" << s.capacity() << endl;
cout << "s现在的size:" << s.size() << endl;
cout << s << endl;
return 0;
}
总结:
reserve和resize的共同点如下:
当n<capacity时,都不会缩减容器本身的容量,即对原内存空间并无影响。
当n>capacity时,都会增大容器本身的容量 即capacity会变化。
reserve和resize的区别点如下:
reserve只会增加capacity,但size不会变化。
resize有可能增加/减少size(n>size||n<size);
resize增加size的同时一定增加了capacity,且无冗余量,此时再增加size一定还要增加capacity。