STL vector size capacity max_size(三)
capacity max_size
vector<int> a;
cout << "capacity: " << a.capacity() << endl;
cout << "max_size" << a.max_size() << endl;
cout << "size: " << a.size() << endl;
capacity: 0
str capacity: 153391689
max_size:1073741823
size: 0
STL容器的capacity属性,表示STL在发生realloc前能允许的最大元素数,也可以理解为预分配的内存空间。例如一个vector<int> v的capacity为5,当插入第6个元素时,vector会realloc,vector内部数据会复制到另外一个内存区域。这样之前指向vector中的元素的指针、迭代器等等均会失效。
max_size属性和capacity不同,表示STL容器允许的最大元素数,通常,这个数是一个很大的常整数,可以理解为无穷大。这个数目与平台和实现相关,在我的机器上vector<int> 、<string>分别如上图。因为max_size很大,所以基本不会发生元素数超过max_size的情况,只需知道两者区别即可。
capacity size
size是当前vector容器真实占用的大小,也就是容器当前拥有多少个容器。
capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间。
这两个属性分别对应两个方法:resize()和reserve()。
使用resize(),容器内的对象内存空间是真正存在的。
使用reserve()仅仅只是修改了capacity的值,容器内的对象并没有真实的内存空间(空间是"野"的),此时切记使用[]操作符访问容器内的对象,很可能出现数组越界的问题。
vector<int> v; //此时没有初始化,所以size()和capacity()都是0;
cout << v.size() << "; " << v.capacity() << endl;
v.push_back(1);
cout << v.size() << "; " << v.capacity() << endl;//容器内有一个元素,那么size和capacity都是1
v.push_back(1);
cout << v.size() << "; " << v.capacity() << endl;//容器内capacity()空间不够,需要申请内容,此时有两个元素,size为2,capacity是2
v.push_back(1);
cout << v.size() << "; " << v.capacity() << endl;//此时容器能够提供的空间是2,又增加元素,不够,需要申请空间,size为3,capacity为4
v.push_back(1);
cout << v.size() << "; " << v.capacity() << endl;//容器还能够提供一个空间,不需要申请新空间,size为4,capacity为4
v.push_back(1);
cout << v.size() << "; " << v.capacity() << endl;//空间不够,需要申请,size()为5,capacity为6
vector::reserve
函数原型:
void reserve(size_type n);
reserve是容器预留空间,但并不是真正创建元素。在创建对象前,不能引用容器中的元素,当插入元素时,需要用push_back()和insert()。
reserve有一个参数:n为预留空间的大小。
vector::resize
函数原型:
void resize(size_type sz,T c = T());
resize是改变容器的大小,并创建对象。调用此函数时,可以引用容器中的对象,当加入新元素时,可以调用operator[]。
resize有两个参数:第一个参数为容器的新大小;第二个参数为加入容器的新元素。第二个参数可缺省。
代码中,在变量s,被resize为10后,其内容如下,可以清晰的看到,其resize并不会改变vector中已经存在的值,只会将重新申请出来的栈空间内的值变为0。
代码中,在变量s,被resize为5后,其内容如下,可以清晰的看到,其resize并不会改变vector中已经存在的值。
代码中,在变量s,被resize为10后,其内容如下,可以清晰的看到,其resize并不会改变vector中已经存在的值,只会将重新申请出来的栈空间内的值变为0。
resize不能用作重新初始化vector,那用什么方法比较好呢?其实可以直接定义一个初始化vector,如原vector的size相同,其值为初始化值。而vector之间的赋值,为深拷贝,这样就能够直接对vector的值进行初始化了,且效率很高(如代码)。
参考:
https://blog.csdn.net/jinx_qixianzhi/article/details/83143748
上一篇: STL——deque
下一篇: C++:STL之deque容器