详解C++STLvector容量(capacity)和⼤⼩(size)的区
别
很多初学者分不清楚 vector 容器的容量(capacity)和⼤⼩(size)之间的区别,甚⾄有⼈认为它们表达的是⼀个意思。本节将对 vector 容量和⼤⼩各⾃的含义做⼀个详细的介绍。
vector 容器的容量(⽤ capacity 表⽰),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数;⽽ vector 容器的⼤⼩(⽤ size 表⽰),指的是它实际所包含的元素个数。
对于⼀个 vector 对象来说,通过该模板类提供的 capacity() 成员函数,可以获得当前容器的容量;通过 size() 成员函数,可以获得容器当前的⼤⼩。例如:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
std::vector<int>value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
cout << "value 容量是:" << value.capacity() << endl;
cout << "value ⼤⼩是:" << value.size() << endl;
return 0;
}
程序输出结果为:
value 容量是:20
value ⼤⼩是:15
结合该程序的输出结果,图 1 可以更好的说明 vector 容器容量和⼤⼩之间的关系。
图 1 vector 容量和⼤⼩的区别
显然,vector 容器的⼤⼩不能超出它的容量,在⼤⼩等于容量的基础上,只要增加⼀个元素,就必须分配更多的内存。注意,这⾥的“更多”并不是 1 个。换句话说,当 vector 容器的⼤⼩和容量相等时,如果再向其添加(或者插⼊)⼀个元素,vector 往往会申请多个存储空间,⽽不仅仅只申请 1 个。
⼀旦 vector 容器的内存被重新分配,则和 vector 容器中元素相关的所有引⽤、指针以及迭代器,都可能会失效,最稳妥的⽅法就是重新⽣成。
举个例⼦:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
cout << "value 容量是:" << value.capacity() << endl;
cout << "value ⼤⼩是:" << value.size() << endl;
printf("value⾸地址:%p\n", value.data());
value.push_back(53);
cout << "value 容量是(2):" << value.capacity() << endl;
cout << "value ⼤⼩是(2):" << value.size() << endl;resize函数c++
printf("value⾸地址: %p", value.data());
return 0;
}
运⾏结果为:
value 容量是:15
value ⼤⼩是:15
value⾸地址:01254D40
value 容量是(2):22
value ⼤⼩是(2):16
value⾸地址: 01254E80
可以看到,向“已满”的 vector 容器再添加⼀个元素,整个 value 容器的存储位置发⽣了改变,同时 vector 会⼀次性申请多个存储空间(具体多少,取决于底层算法的实现)。这样做的好处是,可以很⼤程度上减少 vector 申请空间的次数,当后续再添加元素时,就可以节省申请空间耗费的时间。
因此,对于 vector 容器⽽⾔,当增加新的元素时,有可能很快完成(即直接存在预留空间中);也有可能会慢⼀些(扩容之后再放新元素)。
修改vector容器的容量和⼤⼩
另外,通过前⾯的学习我们知道,可以调⽤ reserve() 成员函数来增加容器的容量(但并不会改变存储元素的个数);⽽通过调⽤成员函数 resize() 可以改变容器的⼤⼩,并且该函数也可能会导致 vector 容器容量的增加。⽐如说:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
cout << "value 容量是:" << value.capacity() << endl;
cout << "value ⼤⼩是:" << value.size() << endl;
cout << "value 容量是(2):" << value.capacity() << endl;
cout << "value ⼤⼩是(2):" << value.size() << endl;
//将元素个数改变为 21 个,所以会增加 6 个默认初始化的元素
//将元素个数改变为 21 个,新增加的 6 个元素默认值为 99。
//size(21,99);
//当需要减⼩容器的⼤⼩时,会移除多余的元素。
//size(20);
cout << "value 容量是(3):" << value.capacity() << endl;
cout << "value ⼤⼩是(3):" << value.size() << endl;
return 0;
}
运⾏结果为:
value 容量是:15
value ⼤⼩是:15
value 容量是(2):20
value ⼤⼩是(2):15
value 容量是(3):30
value ⼤⼩是(3):21
程序中给出了关于 resize() 成员函数的 3 种不同的⽤法,有兴趣的读者可⾃⾏查看不同⽤法的运⾏结果。
可以看到,仅通过 reserve() 成员函数增加 value 容器的容量,其⼤⼩并没有改变;但通过 resize() 成员函数改变 value 容器的⼤⼩,它的容量可能会发⽣改变。另外需要注意的是,通过 resize() 成员函数减
少容器的⼤⼩(多余的元素会直接被删除),不会影响容器的容量。
vector容器容量和⼤⼩的数据类型
在实际场景中,我们可能需要将容器的容量和⼤⼩保存在变量中,要知道 vector<T> 对象的容量和⼤⼩类型都是
vector<T>::size_type 类型。因此,当定义⼀个变量去保存这些值时,可以如下所⽰:
vector<int>::size_type cap = value.capacity();
vector<int>::size_type size = value.size();
size_type 类型是定义在由 vector 类模板⽣成的 vecotr 类中的,它表⽰的真实类型和操作系统有关,在 32 位架构下普遍表⽰的是 unsigned int 类型,⽽在 64 位架构下普通表⽰ unsigned long 类型。
当然,我们还可以使⽤ auto 关键字代替 vector<int>::size_type,⽐如:
auto cap = value.capacity();
auto size = value.size();
到此这篇关于详解C++ STL vector容量(capacity)和⼤⼩(size)的区别的⽂章就介绍到这了,更多相关C++ STL vector容量和⼤⼩内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论