vector<int>c;
c.capacity()返回容器中數據個數,翻倍增長。
1.代碼
#include <iostream>
2 #include <vector>
3 using namespace std;
4 int main()
5 {
6 vector<int>v;
7 v.push_back(1);
8 cout<<"capacity == "<<v.capacity()<<endl;
9
10 v.push_back(2);
11 cout<<"capacity == "<<v.capacity()<<endl;
12
13 v.push_back(3);
14 cout<<"capacity == "<<v.capacity()<<endl;
15 return 0;
16 }
結果:
capacity == 1
capacity == 2
capacity == 4
2.壓縮一個臃腫的vector
很多時候大量的刪除數據,或者通過使用reserver(),結果vector的空間遠遠大於實際的需要。所以需要壓縮vector到它的實際大小。resize()能增加vector的大小。clear()僅僅移除容器內的數據,不能改變capacity()的大小,所以對vector進行壓縮非常重要。
(1)使用capacity()和clear()來操作一個vector
vector<int>v;
v.push_back(1);
cout<<"capacity == "<<v.capacity()<<endl;
v.push_back(2);
cout<<"capacity == "<<v.capacity()<<endl;
v.push_back(3);
cout<<"capacity == "<<v.capacity()<<endl;
v.clear();
cout<<"clear()完之後: "<<v.size()<<endl;
cout<<"clear()完之後的capacity == "<<v.capacity()<<endl;
結果:
capacity == 1
capacity == 2
capacity == 4
clear()完之後: 0
clear()完之後的capacity == 4
(2)通過上面的結果可以發下如下兩個特點:①capacity()返回容器中數據個數,翻倍增長。②當清除完vector後capacity()仍然是4。
(3)下面定義一個新的vector,將原來的賦值給這個新的vector,看看會出現什麼樣的效果。
vector<int>v;
v.push_back(1);
cout<<"capacity == "<<v.capacity()<<endl;
v.push_back(2);
cout<<"capacity == "<<v.capacity()<<endl;
v.push_back(3);
cout<<"capacity == "<<v.capacity()<<endl;
vector<int>v1(v);
cout<<"新的vector的capacity == "<<v1.capacity()<<endl;
結果:
capacity == 1
capacity == 2
capacity == 4
新的vector的capacity == 3
(3)通過上面的結果發現,新的數組的容量是元素的個數3。所以可以使用這種方法來達到壓縮vector。接下來可以使用函數swap()進行優化。
vector<int>v;
v.push_back(1);
cout<<"capacity == "<<v.capacity()<<endl;
v.push_back(2);
cout<<"capacity == "<<v.capacity()<<endl;
v.push_back(3);
cout<<"capacity == "<<v.capacity()<<endl;
vector<int>v1(v);
cout<<"新的vector的capacity == "<<v1.capacity()<<endl;
v.swap(v1);
cout<<"交換後原來vector的capacity == "<<v.capacity()<<endl;
結果:
capacity == 1
capacity == 2
capacity == 4
新的vector的capacity == 3
交換後原來vector的capacity == 3
(4)再次進行優化。採用匿名對象來代替v1這個中間對象:vector<int> (v).swap(v);
vector<int>v;
v.push_back(1);
cout<<"capacity == "<<v.capacity()<<endl;
v.push_back(2);
cout<<"capacity == "<<v.capacity()<<endl;
v.push_back(3);
cout<<"capacity == "<<v.capacity()<<endl;
vector<int> (v).swap(v);
cout<<"交換後vector的capacity == "<<v.capacity()<<endl;
結果:
capacity == 1
capacity == 2
capacity == 4
交換後vector的capacity == 3
注:C++11中已經提供了shrink_to_fit()函數實現vector的壓縮(你希望調用shrink_to_fit來將多餘內存還給系統,但標準庫不保證一定可以達到你的目的,類似於inline來實現函數內聯)。