vector容器内存释放技巧:swap()

vector容器内存释放技巧:swap()

.clear()方法并不会释放内存,他只会清空内容,但是容器内存依然占据着,因此我们需要用一种swap trick来解决这个问题:

​ 下面是一个利用swap trick来修整空间的例子:

1
2
3
4
5
vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>(v).swap(v);

我们指导vector的扩容每次会扩大出大于我们所需要的额外的空间,但是如果后面我们暂时不会向vector中添加东西时,想要删除掉多余的额外空间,也就是修整空间,该怎么办呢?

vector有一个特点就是:容器的拷贝构造函数不会开辟扩容出的空间

即容器A赋值容器B时,即调用容器的拷贝构造函数时,容器B只会开辟正好可以容下容器A所有元素的容量,而不会开辟 容器A扩容出的空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vector<int> v1;
for (int i = 0; i < 100000; i++)
{
v1.push_back(i);
}
cout << "v1的容量:" << v1.capacity() << endl;
cout << "v1的大小:" << v1.size() << endl;

v1.resize(3);
cout << "v1的容量:" << v1.capacity() << endl;
cout << "v1的大小:" << v1.size() << endl;

vector<int>v2(v1);

cout << "v2的容量:" << v2.capacity() << endl;
cout << "v2的大小:" << v2.size() << endl;

在这里插入图片描述

如图容量只为3,而不是138255。同时上图的例子告诉我们resize也不能修整空间

我们可以充分利用容器的拷贝构造函数不会开辟扩容出的空间这个特点,同时利用匿名容器会自动析构这个特点:使用这个技巧vector<int>(v).swap(v);

即 我们首先创造出一个匿名的容器vector<int>() ,给他附上了v的所有元素,即vector<int>(v),此时他的容量等于他的大小。我们将这个匿名的容器和v进行swap()后,v的容量就被修正了,同时匿名函数自动触发析构函数释放空间。

clear()可以清空所有元素。但是即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收。因此同样的技巧可以用于释放vector的所有空间:

用一个空的vector去和我们想要清空的vector pointVec进行swap。

1
vector<Point>().swap(pointVec);

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!