vector容器是动态存储的,跟数组不同,定义vector的时候不需要声明容器的capacity。
首先说明一点,size是小于等于capacity的,一旦size超过了capacity,整个vector容器会“另辟居所”重新开辟更多的空间,这样也就造成了vector容器首地址发生改变。
下面是容器的size和capacity的关系:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v0;
for (int i = 0; i < 100;i++)
{
v0.push_back(i);
}
cout << "v0 capacity is " << v0.capacity() << endl;//128
cout << "v0 size is " << v0.size() << endl;//100
vector<int> v1;
for (int i = 0; i < 10000;i++)
{
v1.push_back(i);
}
cout << "v1 capacity is " << v1.capacity() << endl;//16384
cout << "v1 size is " << v1.size() << endl;//10000
return 0;
}
可以看出,vector容器会根据你传入的数据数量进行自动扩展,总是比你存入的数据多一些。
但是有一些时候我们不需要那么多开辟好的空间,对于数据size是确定的,这时候可以用匿名vector交换vector
先介绍一下vector的内置函数swap(),只贴核心代码了:
vector<int> v1;
v1.reserve(10000);//预设一个空间大小
for (int i = 0; i < 100;i++)
{
v1.push_back(i);
}
cout << "v1 capacity is " << v1.capacity() << endl;//10000
cout << "v1 size is " << v1.size() << endl;//100
vector<int> v2;
v2.reserve(5000);
for (int i = 0; i < 50;i++)
{
v2.push_back(i);
}
cout << "v2 capacity is " << v2.capacity() << endl;//5000
cout << "v2 size is " << v2.size() << endl;//50
v2.swap(v1);
cout << "v1 capacity is " << v1.capacity() << endl;//5000
cout << "v1 size is " << v1.size() << endl;//50
cout << "v2 capacity is " << v2.capacity() << endl;//10000
cout << "v2 size is " << v2.size() << endl;//100
reserve()函数是预设一个大小,不会使其反复开辟,当然如果后续超过这个预设值,vector容器还是会自动开辟的。
上面的代码旨在展示swap()函数交换的是一整个容器,包含的是容器的capacity和数据的size。
交换缩小vector:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1;
for (int i = 0; i < 10000;i++)
{
v1.push_back(i);
}
cout << "v1 capacity is " << v1.capacity() << endl;//16384
cout << "v1 size is " << v1.size() << endl;//10000
v1.resize(3);
cout << "v1 capacity is " << v1.capacity() << endl;//16384
cout << "v1 size is " << v1.size() << endl;//3
vector<int> temp(v1);
cout << "temp capacity is " << temp.capacity() << endl;//3
cout << "temp size is " << temp.size() << endl;//3
temp.swap(v1);
cout << "v1 capacity is " << v1.capacity() << endl;//3
cout << "v1 size is " << v1.size() << endl;//3
vector<int>(v1).swap(v1);//匿名容器,用后自动销毁。除了没有自己的变量名,其他的一样
cout << "v1 capacity is " << v1.capacity() << endl;//3
cout << "v1 size is " << v1.size() << endl;//3
return 0;
}