目的:在一个循环中,每一次循环结束都要清空这个vector容器以供下一次循环再利用这个vector
方法:
vector<double>m1;
vector<double>m2;
m1.swap(m2);

这样就把m1中的元素转移到了m2中,下面我们来看一下结果示例:

vector<double>distance;//创建一个向量
distance.push_back(2.236);//往向量里面添加元素
distance.push_back(1.732);
distance.push_back(2);
distance.push_back(0.2358);
distance.push_back(0.001);

vector<double>dd;//创建一个新的向量
distance.swap(dd);//清空distance,将元素专一到dd中

//【1】检测一下dd向量和distance向量中的元素
cout << "dd中的元素:" << dd[2] << endl;//输出dd向量中第三个元素
cout << "distance中的元素:" << distance[0] << endl;//输出distance中第一个元素

//【2】我们再在distance中加入一个元素
    distance.push_back(0.225);
    cout << distance[0] << endl;//此时再输出distance第一个元素

我们先看一下直接得出什么结果:
这里写图片描述
dd向量中已经有元素了,dd[2]元素之为2,也就是最初的distance[3]的数值,然后再输出distance中的元素时,程序报错,因为distance中已经没有元素了。
我们把【1】注释掉之后在跑程序,得出结果如下:
这里写图片描述
程序跑通了,我们再往distance中加入一个数据,则该数据在distance中的第一个位置。

以上例子说明swap把distance向量给清空了,这个问题就解决了,我们来检测一下distance的大小:

cout<<"释放之后的distance大小为:"<<distance.size()<<endl;
得出结果如下:
这里写图片描述
问题解决啦!

如果循环层数非常多也不用担心,就一直用swap函数往另一个向量中释放就可以了,因为vector容器可以承载数据量非常大:
这里写图片描述

——————————————————————

遇到这个问题的时候我查看了其他的博客和论坛,有些提到用erase和clear函数来星空vector容器的,下面我们来看一下这两个函数能达到什么效果:

erase()函数:

distance.erase(distance.begin(),distance.end());//利用erase函数
cout << "释放后的distance大小:" << distance.size() << endl;//检测释放后的大小
cout << "distance中的元素:" << distance[0] << endl;//检测distance中是否还有元素

程序运行结果如下:
这里写图片描述
内存大小为0,而distance中还有元素,并没有清空!!

clear()函数:

distance.clear();
cout << "释放后的distance大小:" << distance.size() << endl;
cout << "distance中的元素:" << distance[0] << endl;

结果如下:
这里写图片描述
clear()函数和erase()函数两者得出的结果一样,并有达到我们想要的结果:即vector清空,内存释放!!!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐