1. 程式人生 > >如何使用vector的reserve和resize方法

如何使用vector的reserve和resize方法

reserveresize是vector裡兩個很重要的方法,有效地使用這兩個方法可以減少reallocate memory的次數,提高程式的效能,所以還是有必要去研究一下的,先來看一段簡單的程式碼吧。

stdafx.h

  1. // stdafx.h : include file for standard system include files,  
  2. // or project specific include files that are used frequently, but  
  3. // are changed infrequently  
  4. //  
  5. #pragma once  
  6. #include "targetver.h"  
  7. #include <stdio.h>
  8. #include <tchar.h>
  9. // TODO: reference additional headers your program requires here  
  10. #include <iostream>
  11. #include <vector>
  12. #include <string>
  13. using namespace std;  

 test.cpp

  1. // test.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. class A  
  5. {  
  6. public:  
  7.     A() : m_a(0)  
  8.     {  
  9.     }  
  10.     A(int a) : m_a(a)  
  11.     {  
  12.     }  
  13.     A(const A& a) : m_a(a.m_a)  
  14.     {  
  15.     }  
  16.     ~A()  
  17.     {  
  18.     }  
  19. private:  
  20.     int m_a;  
  21. };  
  22. int _tmain(int argc, _TCHAR* argv[])  
  23. {  
  24.     vector<A> myVec;  
  25.     myVec.reserve(100);  
  26.     cout << "capacity:" << myVec.capacity() << endl;  
  27.     cout << "size:" << myVec.size() << endl;  
  28.     for (int i = 0; i < 100; i++)  
  29.     {  
  30.         myVec.push_back(i);  
  31.     }  
  32.     cout << "capacity:" << myVec.capacity() << endl;  
  33.     cout << "size:" << myVec.size() << endl;  
  34.     myVec.resize(102);  
  35.     myVec[100] = 1;  
  36.     myVec[101] = 2;  
  37.     cout << "capacity:" << myVec.capacity() << endl;  
  38.     cout << "size:" << myVec.size() << endl;  
  39.     return 0;  
  40. }  

 輸出:

輸出

reserve用來(預留空間,)改變capacity,不改變size,會去分配記憶體,但不會構造出物件;如果改變後的capacity比當前capacity大,則capacity會變大;反之,capacity不變。可以用下面的程式碼去測試:

  1. vector<A> myVec;  
  2. myVec.reserve(100);  
  3. cout << "capacity:" << myVec.capacity() << endl;  
  4. cout << "size:" << myVec.size() << endl;  
  5. myVec.reserve(90);  
  6. cout << "capacity:" << myVec.capacity() << endl;  
  7. cout << "size:" << myVec.size() << endl;  
  8. myVec.reserve(110);  
  9. cout << "capacity:" << myVec.capacity() << endl;  
  10. cout << "size:" << myVec.size() << endl;  

輸出:


resize用來改變vector的size,有可能也會改變capacity。如果改變後的size比當前capacity大,則capacity會變大,同時構造出多出來的物件;反之,capacity不變,同時析構一些不再需要的物件。可以用下面的程式碼去測試:

  1. vector<A> myVec;  
  2. myVec.resize(100);  
  3. cout << "capacity:" << myVec.capacity() << endl;  
  4. cout << "size:" << myVec.size() << endl;  
  5. myVec.resize(90);  
  6. cout << "capacity:" << myVec.capacity() << endl;  
  7. cout << "size:" << myVec.size() << endl;  
  8. myVec.resize(110);  
  9. cout << "capacity:" << myVec.capacity() << endl;  
  10. cout << "size:" << myVec.size() << endl;  

輸出:


reserve和resize都不會使capacity變小,但都有可能使capacity變大,具體怎麼變大,reserve和resize是不一樣的,reserve能準確控制capacity;而resize不能,vc裡是每次增大一半的當前capacity。可以用下面的程式碼去測試不用reserve和resize的情況(在這種情況下,每當capacity不夠時,就會去allocate一塊新的夠大的記憶體,再釋放以前的記憶體,效率是很低的):

  1. vector<A> myVec;  
  2. cout << "capacity:" << myVec.capacity() << endl;  
  3. cout << "size:" << myVec.size() << endl;  
  4. for (int i = 0; i < 100; i++)  
  5. {  
  6.     myVec.push_back(i);  
  7.     cout << "capacity:" << myVec.capacity() << endl;  
  8.     cout << "size:" << myVec.size() << endl;  
  9. }  

輸出: