1. 程式人生 > >C++中vector記憶體擴充機制

C++中vector記憶體擴充機制

為了支援隨機訪問,vector中的元素採用順序存放,即每一個元素緊挨著前一個元素進行儲存。那麼現在只有可能出現問題了,當記憶體中沒有足夠連續的空間去存放新插入來的元素怎麼辦,C++是這樣處理的:重新分配記憶體空間,將原來舊的元素全部複製到新的儲存空間中去,然後再插入新的元素。因此可以看出,如果記憶體不是特別充足或者記憶體中沒有較大塊的空閒空間的,向vector容器中插入元素可能會有相當大的CPU開銷。其中最糟糕的情況是每次插入一個元素,程式要將所有的元素複製到一個新的記憶體塊上去,當然對於這種情況c++作了一個折衷的處理:當我們插入元素時,如果老的記憶體塊是連續空閒空間不夠,則重新分配一塊記憶體空間,記憶體空間的大小不是隻比舊的記憶體空間大一個元素的大小,相反而是多分配幾個元素空間大小,這樣對於接下來的幾個新插入元素做到有空間可以插入,這樣之後使得vector的效能得到很大提高,不過這是一個折衷的辦法。
vector<int vec;
for(int i = 0; i < 10; i++)
vec.push_back(i);
vector<int::iterator it = vec.begin();
for(int i = 0; i < 5; i++)it++;cout<<&(*it)<<   <<*it<<endl;
it = vec.insert(it , 33);
cout<<&(*it)<<   <<*it<<endl;++it;cout<<&(*it)<<   <<*it<<endl;
行啦,我給出來吧,具體原因可能要你自己去分析了,其實從上面的解釋可以看出原因
003BB93C  33
003BB940  5
呵呵,是不是有點像陣列的隨機插入,要將插入點後的所有資料往後移動。這麼說的話,可能沒有用連結串列高效。
不過根據C++ primer作者給出的解釋,vector的實際使用效率要比list和deque要高一點。主要還是要看應用場景吧。