JayFighting 2020-06-28
vector容器reserve函数的作用:减少vector在动态扩展容量时的扩展次数;
//vector使用reserve预留空间,减少vector在动态扩展容量时的扩展次数 vector<T> v.reserve(int num); //num表示预留空间大小
vector容器内部维护的实际上是一个数组,数组的地址是连续的,而vector在定义时会根据不同的系统算法分配出大于容器大小(size)的容量(capacity),当容器被插满数据的时候(size==capacity),容器会自动扩展其容量,因为数组要求使用连续的内存空间,容器动态扩展实质是将之前的数据全部拷贝到一个较大容量的新空间中,因此每次扩展需要额外的内存消耗。
如在不使用reserve函数预留空间时向一个定义好的vector中插入100000个元素,统计其动态扩展的次数:
void test01() // 不预留空间时扩展的次数 { vector<int> v; // vector容器定义时空间有限 cout << "vector初定义时的容量:" << v.capacity() << endl; int num = 0; //用于统计动态扩展的次数 int * pointer = NULL; for (int i = 0; i < 100000; i++) { v.push_back(i); if (pointer != &v[0]) { pointer = &v[0]; num++; } } cout << "不使用预留空间时的动态分配的次数:" << num << endl; }
以上代码的输出为:
当向vector中插入100000个数时,中间动态内存扩展了30次,这在程序运行中占用了很大一部分时间消耗,因此在知道容器需要使用的大致容量的时候可以通过reserve函数预留空间,即一次性分配足够的空间来减少动态扩展次数,比如:
void test02() // 使用reserve预留空间 { vector<int> v; v.reserve(100000); cout << "vector预留后的容量:" << v.capacity() << endl; int num = 0; //用于统计动态扩展的次数 int * pointer = NULL; for (int i = 0; i < 100000; i++) { v.push_back(i); if (pointer != &v[0]) { pointer = &v[0]; num++; } } cout << "使用预留空间时的动态分配的次数:" << num << endl; }