转载自:嚜寒的CSDN
0)简单介绍
在vector的数据结构中,
.clear();清空数据
.size();当前vector容器内存储的元素的个数
.capacity();当前vector容器重新分配内存之前所能容纳的元素数量
.swap();函数交换
1)问题
在用vector做题时,输入完一组数据处理完后,及时clear(),然后输入下一组数据,但是如果在输入之前,输出之前vector所存的内容,会发现仍然存在,但是如果输出.empty();它会返回1,告诉我们这个容器现在是空的,这是因为使用.clear()清空内容,但是没有释放内存的原因。举例如下:
- #include <iostream>
- #include <vector>
- using namespace std;
- int main()
- {
- vector <int >a;
- cout<<a.empty()<<endl;//输出 1 代表该vector此时是空
- a.push_back(1);
- a.push_back(2);
- cout<<a[0]<<" "<<a[1]<<endl;//输出1 2
- cout<<a.empty()<<endl;//输出 0 代表该vector此时非空
- cout<<a.size()<<endl;//输出2
- cout<<a.capacity()<<endl;//输出2
- cout<<"***************"<<endl;
- //a[0]=NULL;a[1]=NULL; 这是赋值为0,并不清空数据,也不释放内存。
- a.clear();
- cout<<a[0]<<" "<<a[1]<<endl;//仍然输出1 2,因为没有释放内存,所以输出该地址的内容仍然与之前一样
- cout<<a.empty()<<endl;//输出1 代表该vector此时已经为空
- cout<<a.size()<<endl;//输出0,代表当前容器内存储元素个数是0,与.empty()类似,都告诉我们当前容器是空的意思
- cout<<a.capacity()<<endl;//输出2,代表当前该vector在重新分配存储空间前所能容纳的元素数量并没有改变
- cout<<"***************"<<endl;
- /*
- 下面这五行说明,.pop_back()与.clear()起到了相同的作用,都是清空数据,但是没有释放内存
- while(!a.empty()){
- a.pop_back();
- }
- cout<<a.empty()<<endl;//输出 1 代表该vector此时已经为空
- cout<<a[0]<<" "<<a[1]<<endl;//仍然输出为 1 2,因为没有释放内存,所以输出该地址的内容仍然与之前一样
- */
- a.push_back(4);
- cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;//输出 4 2 0 尽管没有释放内存,但是已经认为该vector已经被清空,所以再push_back();时,a[0]被覆盖。
- cout<<a.size()<<endl;//输出1,代表当前容器内存储元素个数是1,就是刚刚push_back();装进去的数起到的作用
- cout<<a.capacity()<<endl;//此时仍然输出2
- cout<<"***************"<<endl;
- //那么如何释放内存呢?我们用swap交换到一个新的类型的vector,将原来的a拷贝出去,然后自然销毁,而新的到的a是全新的没有存任何数据的
- vector<int>().swap(a);
- //a.swap();
- cout<<a.size()<<endl;//输出 0
- cout<<a.capacity()<<endl;.// 输出 0
- //cout<<a[1]<<endl;
- }