vector内存释放方法
来源:互联网 发布:php mktime函数 编辑:程序博客网 时间:2024/05/24 05:29
vector容器是自增长的。一般的,在容器对象中insert或push一个元素时,该对象的大小增加1。.
而且vector中的元素是连续存放的,当在容器中增加一个新元素时,如果原来的储存空间刚好被用完,那么系统需要重新寻找一个更大的连续储存空间,把原来的元素复制到新空间,并在最后添加新元素,最后再撤销旧空间。更特殊情况下,假设每次vector添加一个元素时,空间都被用完,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说,vector容器预留了一些额外的存储区,用于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。
关于vector的内存空间,有两个函数需要注意:size()成员指当前拥有的元素个数;capacity()成员指当前(容器必须分配新存储空间之前)可以存储的元素个数。reserve()成员可以用来控制容器的预留空间。
每当系统预先分配一块capacity大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。
这样便造成一个问题,即使 你使用clear()函数清空容器,系统为容器分配的capacity大小的空间依然存在。
而调用reserve(0),也不能使容器的预留空间变为0。
所以在相关资料中有人提到以swap()函数来释放vector内存。
vector<int> ivec(5,2); //使用5个整形数值2初始化
vector<int>().swap(ivec); // 释放vector内存的一种方式:利用swap函数,和临时对象交换
下面举个例子来说明vector的存储状态:
#include<iostream>using namespace std;#include<vector>int main(){ vector<int> ivec(5,2); //使用5个整形数值2初始化 for(int i=0; i<ivec.size(); i++) cout<<ivec[i]; //使用下标访问每个元素 cout<<endl; ivec.push_back(3); //尾部添加3 ivec.insert(ivec.begin(),1); //在ivec头添加元素1,注意该操作时间复杂度为O(n) for(vector<int>::iterator it = ivec.begin(); it != ivec.end(); it++) //使用迭代器访问每个元素 cout<<*it; cout<<endl; ivec.clear(); //将容器清空,并未释放内存 cout<<"size:"<<ivec.size()<<" capacity:"<<ivec.capacity()<<endl;// ivec.reserve(0); //设置对象实际占用的储存空间(实际上只能额外增加对象实际占用空间),reserve(0)在这里并没有用。 vector<int>().swap(ivec); // 释放vector内存的一种方式:利用swap函数,和临时对象交换, // 使S对象的内存为临时对象的内存一样,而临时对象的内存为S对象的内存。 // 交换以后,临时对象消失,释放内存。 cout<<"size:"<<ivec.size()<<" capacity:"<<ivec.capacity()<<endl; for(int i=0; i<10; i++) ivec.push_back(i); cout<<"size:"<<ivec.size()<<" capacity:"<<ivec.capacity()<<endl; for(int i=0; i<90; i++) ivec.insert(ivec.end(),i); cout<<"size:"<<ivec.size()<<" capacity:"<<ivec.capacity()<<endl; ivec.reserve(200); cout<<"size:"<<ivec.size()<<" capacity:"<<ivec.capacity()<<endl; return 0;
以上代码执行结果:
22222
1222223
size:0 capacity:10 //clear()后,size为0。但是capacity仍为10
size:0 capacity:0 //swap()后内存释放
size:10 capacity:16
size:100 capacity:128
size:100 capacity:200
Press ENTER or type command to continue
- vector内存释放方法
- 释放vector内存的两种方法
- Vector的内存释放
- vector内存释放机制
- vector的内存释放
- c++ vector 释放内存
- vector的内存释放
- c++ vector 内存释放
- vector 释放内存 swap
- vector的内存释放
- vector内存释放机制
- vector的内存释放
- 正确释放Vector内存
- c++ vector 释放内存
- vector内存释放
- vector的内存释放
- vector 释放内存 swap
- vector 释放内存 swap
- UVa10603 - Fill
- 一次永久解决cmd窗口汉字显示乱码
- 为什么叫印度阿三
- 获取AndroidManifest.xml中的meta-data数值
- iOS——UIDatePicker的用法
- vector内存释放方法
- Angular的Table们
- sql相关语句
- 不可变String及可变StringBuilder
- Learning path
- warden error when push apps
- 给定一个数组,从中查找是否存在两个数的和等于一个给定的x
- “==”和“equals()”的不同
- solr5.1安装 tomcat单机版