步步爲營(九)常用數據結構(2)STL-Vector(動態數組)

和鏈表相對的就是數組了,這兩種結構是最基本的數據結構類型了。
C++自身實現了一個array容器,但是STL裏的動態數組Vector(直譯爲向量)使用更方便,這裏還是討論下Vector。

Vector是內存連續的,空間按需增長的結構。

Vector和List是剛好相反的,Vector在隨機存儲的操作上非常方便,但是在增加和刪除元素時非常麻煩。如果你想刪除一個元素,就必須移動後面所有的元素向前一位,如果刪除和增加的操作比較多,那麼消耗的時間是很恐怖的。

Vector的空間分配是這樣的:如果當前的空間不夠儲存,則把當前空間擴大一倍使用。如果擴大一倍之後還不夠,就繼續擴大到需要的大小。
也就是說,如果當前Vector的空間爲200,你一次插入300個數據,那麼空間的演變就是:200->400->800;
這種分配方式導致在特殊情況下,Vector對於內存消耗會特別大,所以對於Vector的空間分配一定要進行預估,防止出現內存倍增的情況。
使用vector時,推薦用reserve()成員函數預先分配需要的內存空間,它既可以保護迭代器使之不會失效,又可以提高運行效率。

下面附上Vector成員函數說明:

vector<Elem> c     創建一個空的vector。

vector <Elem> c1(c2)     複製一個vector。

vector <Elem> c(n)     創建一個vector,含有n個數據,數據均已缺省構造產生。

vector <Elem> c(n, elem)     創建一個含有n個elem拷貝的vector。

vector <Elem> c(beg,end)     創建一個以[beg;end)區間的vector。。

~ vector <Elem>()     銷燬所有數據,釋放內存。


operator[]  返回容器中指定位置的一個引用。


assign(beg,end)    將[beg; end)區間中的數據賦值給c。

assign(n,elem)    將n個elem的拷貝賦值給c。

at(idx)    傳回索引idx所指的數據,如果idx越界,拋出out_of_range。

back()    傳回最後一個數據,不檢查這個數據是否存在。

begin()    傳回迭代器重的可一個數據。

capacity()    返回容器中數據內存大小。

clear()    移除容器中所有數據。

empty()    判斷容器是否爲空。

end()    指向迭代器中的最後一個數據地址。

erase(pos)     刪除pos位置的數據,傳回下一個數據的位置。

erase(beg,end)     刪除[beg,end)區間的數據,傳回下一個數據的位置。

front()    傳回第一個數據。

get_allocator    使用構造函數返回一個拷貝。

insert(pos,elem)    在pos位置插入一個elem拷貝,傳回新數據位置。

insert(pos,n,elem)    在pos位置插入n個elem數據。無返回值。

insert(pos,beg,end)    在pos位置插入在[beg,end)區間的數據。無返回值。

max_size()    返回容器中最大數據的數量。

pop_back()   刪除最後一個數據。

push_back(elem)    在尾部加入一個數據。

rbegin()    傳回一個逆向隊列的第一個數據。

rend()    傳回一個逆向隊列的最後一個數據的下一個位置。

resize(num)    重新指定隊列的長度。

reserve()    保留適當的容量。

size()    返回容器中實際數據的個數。

swap(c1,c2)    將c1和c2元素互換。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章