Vector清空数据与释放内存(.clear与.swap的区别与使用)

0)简单介绍

在vector的数据结构中,

.clear();清空数据

.size();当前vector容器内存储的元素的个数

.capacity();当前vector容器重新分配内存之前所能容纳的元素数量

.swap();函数交换


1)问题

在用vector做题时,输入完一组数据处理完后,及时clear(),然后输入下一组数据,但是如果在输入之前,输出之前vector所存的内容,会发现仍然存在,但是如果输出.empty();它会返回1,告诉我们这个容器现在是空的,这是因为使用.clear()清空内容,但是没有释放内存的原因。举例如下:

#include 
#include 

using namespace std;
int main()
{
	vector a;
	cout<().swap(a);
	//a.swap();
	cout<


2)处理办法

So,如果我们只是做题,.clear();就可以继续输入下一组数据了,尽管占据的内存大小不一定是我们希望的大小(不是输入新的数据后应该占据的内存大小),但一般不会影响到做题。

如果我们想得到一个全新的该vector,那就用1)中code最后展示的一部分,用.swap();重新拷贝一个全新的vector,然后原有的vector会被自然销毁。另一个解决方法就是在每一次重新输入数据之前,我们都重新定义,当然这不是让你在一个作用域内将同名函数重定义(会报错),我们是指在比如for的每次循环的开头重新定义,让他们处在不同作用域,如下:

#include 
#include 

using namespace std;
int main()
{
	int n=10;
	while(n--){
		vector a;
		int k;
		cin>>k;
		for(int i=1;i<=k;i++){
			a.push_back(k);
		}
		cout<


3)关于vector存储数据以及用.swap()释放内存的原理解释

vector由于是一个不定长存储的数据结构,每一次分配的大小都是比面前输入的数据个数略大一点(实际上也并不准确,参看2)code中注释,是介于2^n与2^(n+1)之间),所以每一次push_back()且发现当被分配的存储空间已装满数据时,都是将包含现有数据的vector进行拷贝,进入一个更大一点的vector,而原有的vector就会被自然销毁,我们用.swap()释放内存的原理其实是相似的,即手动进行了一次人工拷贝的操作。


你可能感兴趣的:(ACM,其他)