欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL vector size capacity max_size(三)

程序员文章站 2024-02-12 22:20:16
...

 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有两个参数:第一个参数为容器的新大小;第二个参数为加入容器的新元素。第二个参数可缺省。

 STL vector size capacity max_size(三)                   STL vector size capacity max_size(三)

STL vector size capacity max_size(三)                    STL vector size capacity max_size(三)

代码中,在变量s,被resize为10后,其内容如下,可以清晰的看到,其resize并不会改变vector中已经存在的值,只会将重新申请出来的栈空间内的值变为0。

STL vector size capacity max_size(三)                      STL vector size capacity max_size(三)

代码中,在变量s,被resize为5后,其内容如下,可以清晰的看到,其resize并不会改变vector中已经存在的值。 

STL vector size capacity max_size(三)                 STL vector size capacity max_size(三)

代码中,在变量s,被resize为10后,其内容如下,可以清晰的看到,其resize并不会改变vector中已经存在的值,只会将重新申请出来的栈空间内的值变为0。 

STL vector size capacity max_size(三)   STL vector size capacity max_size(三)

STL vector size capacity max_size(三)       STL vector size capacity max_size(三)

        resize不能用作重新初始化vector,那用什么方法比较好呢?其实可以直接定义一个初始化vector,如原vector的size相同,其值为初始化值。而vector之间的赋值,为深拷贝,这样就能够直接对vector的值进行初始化了,且效率很高(如代码)。

 参考:

https://blog.csdn.net/jinx_qixianzhi/article/details/83143748

相关标签: vector