考點:vector的理解與實現細節
解析:vector的定義如下:
template>
class vector ;
這裡省略了中間的成員。其中_ty型別用於表示vector中儲存的元素型別,_a預設為allocator<_ty>型別。
這裡需要說明的是allocator類,它是一種記憶體配置器,負責提供記憶體管理(可能包含記憶體分配、釋放、自動**等能力)相關的服務。於是對於程式設計師來說,就不用關心記憶體管理方面的問題。
vector支援隨機訪問,因此為了效率方面的考慮,它內部使用動態陣列的方式實現。當進行insert或push_back等增加元素的操作時,如果此時動態陣列的記憶體不夠用,就要動態的重新分配,一般是當前大小的兩倍,然後把原陣列的內容拷貝過去。所以在一般情況下,其訪問速度同一般陣列,只有在重新分配發生時,其效能才會下降。例如,下面的程式:
#include #include using namespace std;
int main()
下面是各個執行步驟:
(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的記憶體,然後把原來陣列中的1、2以及新加入的3拷貝到新分配的記憶體,最後釋放原陣列的記憶體。
(5)**15行,在陣列末尾新增元素3。此時容量為4,而元素個數需要變為3,因此容量足夠,不需要分配記憶體,直接把4拷貝到陣列的最後即可。
以後的操作不再贅述。注意vector的size()和capacity()是不同的,前者表示陣列中元素的多少,後者表示陣列有多大的容量。由上面的分析可以看出,使用vector的時候需要注意記憶體的使用,如果頻繁地進行記憶體的重新分配,會導致效率低下。
vector內部使用動態陣列的方式實現的。如果動態陣列的記憶體不夠用,就要動態的重新分配,一般是當前大小的兩倍,然後把原陣列的內容拷貝過去。所以,在一般情況下,其訪問速度同一般陣列,只有在重新分配發生時,其效能才會下降。它的內部使用allocator類進行記憶體管理,程式設計師不需要自己操作記憶體。
Java陣列面試題請教一下?
下面哪個陣列定義是錯誤的。並對錯誤的答案加上單行注釋,寫出錯誤的原因。a,float new float 3 b,float f2 new float c,float f1 new float 3 d,boolean b e,double f4 f,int f5 new int 3 g,float ...
分享一下今天的面試題
悲催的又要開始找工作了。從今天開始,遇到好的面試題就記下來給大家分享一下。今天的收穫還是不錯的,雖然杯具了,但那公司的面試題目有點意思。其實很多都是基礎,抽象類啊,繼承過載啊,可是以前都不怎麼重視。現在開始,不懂的面試題都要記下來,回來後找解決方法。1 題目要求差不多是這樣 完成下面的方法,要求返回...
華為的面試題 ,大家看一下
typedef int pint define pint int 那麼 const pint p p不可更改,但p指向的內容可更改 const pint p p可更改,但是p指向的內容不可更改。上面說的對嗎?答案const pint p1 p1不可更改,但p1指向的內容可更改 const pint ...