用 vectors 改进内存的再分配,用 vectors 改进内存的再分配
【 tulaoshi.com - C语言心得技巧 】
用 vectors 改进内存的再分配
作者:Danny Kalev
编译:MTT 工作室
原文出处:Improving Memory Reallocation with Vectors
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)#include <iostream>using namespace std;int main(){int size=2; // 初始化数组大小;在运行时调整。int *p = new int[size];int isbn;for(int n=0; ;++n){cout<< "enter an ISBN; press 0 to stop ";cin>>isbn;if (isbn==0)break;if (n==size) // 数组是否到达上限?reallocate(p, size);p[n]=isbn; // 将元素插入扩容的数组}delete [] p; // 不要忘了这一步!}
注意上述这个向数组插入数据的过程是多么的繁琐。每次反复,循环都要检查缓存是否达到上限。如果是,则程序调用用户定义的函数 reallocate(),该函数实现如下:
#include <algorithm> // for std::copyint reallocate(int* &p, int& size){size*=2; // double the array''s size with each reallocationint * temp = new int[size];std::copy(p, p+(size/2), temp);delete [] p; // release original, smaller bufferp=temp; // reassign p to the newly allocated buffer}reallocate() 使用 STL std::copy() 算法对缓存进行合理的扩充——每次扩充都放大一倍。这种方法可以避免预先分配过多的内存,从量上减少需要重新分配的内存。这个技术需要得到充分的测试和调试,当初学者实现时尤其如此。此外,reallocate() 并不通用,它只能处理整型数组的情形。对于其它数据类型,它无能为力,你必须定义该函数额外的版本或将它模板化。幸运的是,有一个更巧妙的办法来实现。
#include <iostream>#include <vector>using namespace std;int main(){vector <int> vi;int isbn;while(true){cout << "enter an ISBN; press 0 to stop ";cin >> isbn;if (isbn==0)break;vi.push_back(isbn); // insert element into vector}}在 vector 对象构造期间,它先分配一个由其实现定义的默认的缓存大小。一般 vector 分配的数据存储初始空间是 64-256 存储槽(slots)。当 vector 感觉存储空间不够时,它会自动重新分配更多的内存。实际上,只要你愿意,你可以调用 push_back() 任何多次,甚至都不用知道一次又一次的分配是在哪里发生的。
for (int n=0; n<vi.size(); ++n){ cout<<"ISBN: "<
来源:http://www.tulaoshi.com/n/20160129/1486251.html
看过《用 vectors 改进内存的再分配》的人还看了以下文章 更多>>