系列文章
http://t.csdnimg.cn/u80hL
目录
- 系列文章
- @[TOC](目录)
- 一、reserve——请求容量的变化
- 二、resize——操作对象使用的空间
目录
- 系列文章
- @[TOC](目录)
- 一、reserve——请求容量的变化
- 二、resize——操作对象使用的空间
一、reserve——请求容量的变化
- 改变对象的capacity——他会请求开辟和缩小对象所占的空间,reserve只能操作对象未使用的空间;
- 其存在意义为:因为开辟空间的操作所消耗的资源太多了,所以在知道需要多少空间的前提下请求提前一次性开辟一个确定够用的空间,避免反复开空间;
- reserve请求实际开辟的空间大小会大于或等于我们给出的数值,具体值根据不同的编译器有所不同,如g++会给等于数值大小的空间、visual会给数值1.5倍大小的空间;
- 如果对象已经使用了空间,而我们使用reserve请求变化的空间值小于对象使用的空间,会有两种情况:
情况1:请求的新空间大于等于对象已经使用的空间大小,此时编译器会在保留对象已经使用的空间不受干扰的情况下,去释放对象没有使用的空间;
情况2:请求的新空间小于对象已经使用的空间大小,此时编译器会将空间缩小到刚好存储对象已经使用的空间大小;
如代码所示,请求开辟较大的空间、请求缩小空间:
#include<iostream>
using namespace std;
int main()
{//reservestring s1; //定义一个对象s1 = "0123456789";cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;cout << endl;s1.reserve(30); //给这个对象请求更大的空间使用权cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;cout << endl;s1.reserve(15); //请求给对象更小的使用权cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0;
}
ps. 在实践时我发现,编译器会优化我们的 reserve()请求,编译器会根据具体的情况决定要不要执行我们的开拓和缩小请求。
二、resize——操作对象使用的空间
- 通过resize我们可以直接操作对象使用的空间,这种操作是强硬的;
- resize的操作会有3种情况:
情况1:resize的空间大于原size和capacity,此时原size会被扩大到新的size大小,那些没有实质内容的空间可以指定一种字符去填充,如果没有指定则会自动用’\0’填充,而capacity会自动扩容直到可以包括下新的size;
情况2:resize的空间大于原size而小于capacity,此时原size会被扩大到新的size大小,那些没有实质内容的空间可以指定一种字符去填充,如果没有指定则会自动用’\0’填充;
情况3:resize的空间小于原size,此时编译器会舍去不在新size存储空间里面的信息,而capacity不做改变;
如下代码,使用resize()扩大和缩小对象空间使用。
void test2()
{string s2; //定义一个对象s2 = "0123456789";cout << s2 << endl;cout << s2.size() << endl;cout << s2.capacity() << endl;cout << endl;s2.resize(20);cout << s2 << endl;cout << s2.size() << endl;cout << s2.capacity() << endl;cout << endl;s2.resize(5);cout << s2 << endl;cout << s2.size() << endl;cout << s2.capacity() << endl;cout << endl;
}