vector的定義以下:
template<class _Ty, class _A = allocator<_Ty> >
class vector {
……
};
這裏省略了中間的成員。其中_Ty類型用於表示vector中存儲的元素類型,_A默認爲allocator<_Ty>類型。
這裏須要說明的是allocator類,它是一種「內存配置器」,負責提供內存管理(可能包含內存分配、釋放、自動回收等能力)相關的服務。因而對於程序員來講,就不用關心內存管理方面的問題。
vector支持隨機訪問,所以爲了效率方面的考慮,它內部使用動態數組的方式實現的。當進行insert或push_back等增長元素的操做時,若是此時動態數組的內存不夠用,就要動態的從新分配,通常是當前大小的兩倍,而後把原數組的內容拷貝過去。因此,在通常狀況下,其訪問速度同通常數組,只有在從新分配發生時,其性能纔會降低。例以下面的程序:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v; //初始時無元素,容量爲0
cout << v.capacity() << endl;
v.push_back(1) ; //容量不夠,分配1個元素內存
cout << v.capacity() << endl;
v.push_back(2); //容量不夠,分配2個元素內存
cout << v.capacity() << endl;
v.push_back(3); //容量不夠,分配4個元素內存
cout << v.capacity() << endl;
v.push_back(4);
v.push_back(5); //容量不夠,分配8個元素內存
cout << v.capacity() << endl;
v.push_back(6);
v.push_back(7);
v.push_back(8);
v.push_back(9); //容量不夠,分配16個元素內存
cout << v.capacity() << endl;
return 0;
}
下面是各個執行步驟:
(1)代碼7行,初始化時v無元素(size爲0),且容量(capacity)也爲0。
(2)代碼9行,在數組末尾添加元素1,因爲容量不夠,所以allocator分配1個int大小的內存,並把整數1複製到這個內存中。
(3)代碼11行,在數組末尾添加元素2。此時容量爲1,但元素個數須要變爲2,所以容量不夠,因而allocator先分配原來容量的2倍大小的內存(即2個int大小的內存),而後把原來數組中的1和新加入的2拷貝到新分配的內存中,最後釋放原來數組的內存。
(4)代碼13行,在數組末尾添加元素3。此時容量爲2,而元素個數須要變爲3,所以容量也不夠。和(3)相同,allocator分配4個int的內存,而後把原來數組中的一、2以及新加入的3拷貝到新分配的內存,最後釋放原數組的內存。
(5)代碼15行,在數組末尾添加元素3。此時容量爲4,而元素個數須要變爲3,所以容量足夠,不須要分配內存,直接把4拷貝到數組的最後便可。
之後的操做再也不贅述。注意vector的size()和capacity()是不一樣的,前者表示數組中元素的多少,後者表示數組有多大的容量。由上面的分析能夠看出,使用vector的時候須要注意內存的使用,若是頻繁地進行內存的從新分配,會致使效率低下。
答案:
STL(Standard Template Library),即標準模板庫,是一個具備工業強度的,高效的C++程序庫。它被容納於C++標準程序庫中,包括容器、算法、迭代器組件。
vector內部使用動態數組的方式實現的。若是動態數組的內存不夠用,就要動態的從新分配,通常是當前大小的兩倍,而後把原數組的內容拷貝過去。因此,在通常狀況下,其訪問速度同通常數組,只有在從新分配發生時,其性能纔會降低。它的內部使用allocator類進行內存管理,程序員不須要本身操做內存。