1. 程式人生 > 實用技巧 >vector容器使用reserve預留空間

vector容器使用reserve預留空間

vector容器reserve函式的作用:減少vector在動態擴充套件容量時的擴充套件次數;

//vector使用reserve預留空間,減少vector在動態擴充套件容量時的擴充套件次數
vector<T> v.reserve(int num);   //num表示預留空間大小

vector容器內部維護的實際上是一個數組,陣列的地址是連續的,而vector在定義時會根據不同的系統演算法分配出大於容器大小(size)的容量(capacity),當容器被插滿資料的時候(size==capacity),容器會自動擴充套件其容量,因為陣列要求使用連續的記憶體空間,容器動態擴充套件實質是將之前的資料全部拷貝到一個較大容量的新空間中,因此每次擴充套件需要額外的記憶體消耗。

如在不使用reserve函式預留空間時向一個定義好的vector中插入100000個元素,統計其動態擴充套件的次數:

 1 void test01() // 不預留空間時擴充套件的次數
 2 {
 3     vector<int> v;  // vector容器定義時空間有限
 4     cout << "vector初定義時的容量:" << v.capacity() << endl;
 5 
 6     int num = 0; //用於統計動態擴充套件的次數
 7     int * pointer = NULL; 
 8     for (int i = 0
; i < 100000; i++) 9 { 10 v.push_back(i); 11 12 if (pointer != &v[0]) 13 { 14 pointer = &v[0]; 15 num++; 16 } 17 } 18 19 cout << "不使用預留空間時的動態分配的次數:" << num << endl; 20 }

以上程式碼的輸出為:

當向vector中插入100000個數時,中間動態記憶體擴充套件了30次,這在程式執行中佔用了很大一部分時間消耗,因此在知道容器需要使用的大致容量的時候可以通過reserve函式預留空間,即一次性分配足夠的空間來減少動態擴充套件次數,比如:

 1 void test02() // 使用reserve預留空間
 2 {
 3     vector<int> v;
 4     v.reserve(100000);
 5     cout << "vector預留後的容量:" << v.capacity() << endl;
 6 
 7     int num = 0; //用於統計動態擴充套件的次數
 8     int * pointer = NULL;
 9     for (int i = 0; i < 100000; i++)
10     {
11         v.push_back(i);
12 
13         if (pointer != &v[0])
14         {
15             pointer = &v[0];
16             num++;
17         }
18     }
19 
20     cout << "使用預留空間時的動態分配的次數:" << num << endl;
21 }