直接上示例代码:
#include<iostream>
#include<string>
#include<vector>
#include<iterator>
using namespace std;
int main()
{
vector<int> v;
for (int i = 0; i < 100000; i++)
{
v.push_back(i);
}
cout << "v的容量" << v.capacity() << endl;
cout << "v的尺寸" << v.size() << endl;
cout << endl;
//给v重新设定尺寸
v.resize(3);
cout << "resize后v的容量" << v.capacity() << endl;
cout << "resize后v的尺寸" << v.size() << endl;
cout << endl;
//给v收缩内存
vector<int>(v).swap(v);
cout << "收缩内存后v的容量" << v.capacity() << endl;
cout << "收缩内存后v的尺寸" << v.size() << endl;
return 0;
}
运行结果截图:
从上面的代码可以发现,直接用resize()
成员只能做到缩小尺寸(size),而实际的容量(capacity)并没有缩小。但是,使用swap()
成员就能做到同时收缩v的容量。
原理就是,先利用待收缩的v进行拷贝构造创建出一个匿名对象,这个对象的尺寸和容量大小都是v当前的尺寸大小(上面例子中也就是3)。然后匿名对象调用swao()
成员,与v交换指针(容器交换),匿名对象的指针指向之前v的那片内存空间,v的指针指向匿名对象的那片内存空间。这样v的尺寸和容量就都能得到收缩了。(执行完这行语句之后,由于是匿名对象,所以匿名对象所知的那篇内存空间会被释放)