首页 / 软件开发 / C++ / C++ STL中用vector 改进内存的再分配
C++ STL中用vector 改进内存的再分配2011-04-12winter本文描述的是一种很常见的情况:当你在某个缓存中存储数据时,常常需要在运行时调整 该缓存的大小,以便能容纳更多的数据。本文将讨论如何使用 STL 的 vector 进行内存的再 分配。这里描述的是一种很常见的情况:当你在某个缓存中存储数据时,常常需要在 运行时调整该缓存的大小,以便能容纳更多的数据。传统的内存再分配技术非常繁琐,而且 容易出错:在 C 语言中,一般都是每次在需要扩充缓存的时候调用 realloc()。在 C++ 中 情况更糟,你甚至无法在函数中为 new 操作分配的数组重新申请内存。你不仅要自己做分配 处理,而且还必须把原来缓存中的数据拷贝到新的目的缓存,然后释放先前数组的缓存。本 文将针对这个问题提供一个安全、简易并且是自动化的 C++ 内存再分配技术—— 即使用 STL 的 vector。用 STL vector 对象取代内建的数组来保存获取的数据,既 安全又简单,并且是自动化的。进一步的问题分析在提出解决方案之前,我 先给出一个具体的例子来说明 C++ 重新分配内存的弊病和复杂性。假设你有一个编目应用程 序,它读取用户输入的 ISBNs,然后将之插入一个数组,直到用户输入 0 为止。如果用户插 入的数据多于数组的容量,那么你必须相应地增加它的大小:#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::copy
int reallocate(int* &p, int& size)
{
size*=2; // double the array""s size with each reallocation
int * temp = new int [size];
std::copy(p, p+(size/2), temp);
delete [] p; // release original, smaller buffer
p=temp; // reassign p to the newly allocated buffer
}
reallocate() 使用 STL std::copy() 算法对缓存进行合理的 扩充——每次扩充都放大一倍。这种方法可以避免预先分配过多的内存,从量上 减少需要重新分配的内存。这个技术需要得到充分的测试和调试,当初学者实现时尤其如此 。此外,reallocate() 并不通用,它只能处理整型数组的情形。对于其它数据类型,它无能 为力,你必须定义该函数额外的版本或将它模板化。幸运的是,有一个更巧妙的办法来实现 。