vector和string的内存管理
来源:互联网 发布:ps for mac 迅雷下载 编辑:程序博客网 时间:2024/05/17 01:59
vector 和 string是stl中比较常用的容器,它们都能随着数据的增加自动增加自身的容量。
vector是用动态数组实现的,当vector没有元素时,数组大小为0,一旦vector中加入元素,加入元素后的总大小大于当前vector的容量时,vector会开辟一块更大的空间,将原来的元素拷贝到新的空间,然后析构原来的元素,最后释放原来所占用的空间。所以当不断有元素加入到vector容器时,所花费的代价还是挺高的。幸好vector提供了一个reserve函数可以将空间直接扩大到想要的空间的大小,避免多次开辟空间,拷贝元素,析构元素这些操作。
如果将vector容器的元素删除一些,希望释放多余的空间,那怎么办呢。遗憾的是reserve函数只能增加容器的容量,而不能减少,当vector发现reverse的参数比容量小时,它什么也不做,直接返回了。stl提供了swap方法来释放vector多余的空间,不过使用的时候不那么明显。swap的函数的本意是交换,即交换两个容器的元素,我们可以通过声明一个临时的vector容器,将vector容器的元素拷贝到临时容器中去,然后将vector容器和临时容器交换,由于临时容器添加的元素是vector容器的元素,所以它不会有很多多余的空间(这也和不同的stl实现厂家相关)。总之一句话,reserve函数可以增加vector容器的容量,swap函数可以减小vector容器容量。
string容器的内存管理情况和vector容器大致相同,只是有细微的差别。string也是根据元素的多少自动增加自身的容量,它也可以通过reserve函数直接增加容量。不同的是string通过reserver函数减少容量,而不是通过swap函数。我在redhat和suse上都尝试过,他们的实现结果都是这样的,我暂时还不清楚string的swap函数的实现为什么没有减少它的容量,如果读者知道,请告诉我一下。
下面是我写的测试vector和string的代码,代码在redhat 5 上可以通过编译和运行,其中vector和string的容量增长是按2的倍数增长的,即每当容量超过是,容量加倍。
#include<stdio.h>#include<vector>#include<string>using namespace std;typedef vector<int> intV;void testvector(){ printf("---------testvector----------\n"); intV intv;int i = 0;int n = 1000;int capacity = intv.capacity();printf("size:%d, capacity:%d\n", intv.size(), intv.capacity()); for(i = 0; i < n; i++) { if(capacity != intv.capacity()) { printf("capacity:%d\n", intv.capacity());capacity = intv.capacity(); }intv.push_back(i); } intv.clear(); intv.reserve(1000); for(i = 0; i < 10; i++) {intv.push_back(i); }printf("size:%d, capacity:%d\n", intv.size(), intv.capacity()); intv.reserve(50);printf("after reserve size:%d, capacity:%d\n", intv.size(), intv.capacity());intV(intv).swap(intv);printf("after swap size:%d, capacity:%d\n", intv.size(), intv.capacity());}void teststring(){ printf("\n\n---------teststring----------\n"); string str;int i = 0;int n = 1000;int capacity = str.capacity();printf("size:%d, capacity:%d\n", str.size(), str.capacity()); for(i = 0; i < n; i++) { if(capacity != str.capacity()) { printf("capacity:%d\n", str.capacity());capacity = str.capacity(); }str += "0"; } str.clear(); str.reserve(1000); for(i = 0; i < 10; i++) {str += "0"; }printf("size:%d, capacity:%d\n", str.size(), str.capacity());string(str).swap(str);printf("after swap size:%d, capacity:%d\n", str.size(), str.capacity()); str.reserve(10);printf("after reserve size:%d, capacity:%d\n", str.size(), str.capacity());}int main(){ testvector(); teststring(); return 0;}
- vector和string的内存管理
- vector的内存管理
- vector的内存管理
- vector<char*>和vector<string>的不同
- C++ STL vector 的内存管理
- vector的构造与内存管理
- C++中vector容器的内存管理
- vector的构造与内存管理
- string的内存管理问题
- vector内存管理
- stl vector 内存管理
- vector内存管理
- vector和string最重要的区别
- STL: string和vector的容量变化
- string和vector
- string和vector
- string 和 vector 初探
- 2.vector和string
- unity3D之简单的碰撞检测 .
- Oracle主键与复合主键的性能分析
- 主函数 main WinMain _tmain _tWinMain 的区别
- 人事时地物各指什么?
- 地理信息系统中的量算
- vector和string的内存管理
- Android SYSTEM 系统文件夹结构解析
- Directx10,11的SwapChain,RenderTarget和DepthBuffer解释
- 稳扎稳打Silverlight(53) - 4.0通信之对WCF NetTcpBinding的支持, 在Socket通信中通过HTTP检索策略文件, HTTP请求中的ClientHttp和Browse
- 5M1E分析法-产品质量特性波动
- 动画效果 --Animation 总汇
- Directx11之Debug DirectCompute_将数据从GPU读到CPU
- Android之关于手势操作图片的缩放与移动
- BitTorrent尝试新的广告模式