STL中的 vector 容器詳解

2021-09-26 21:50:20 字數 3255 閱讀 4917

vector作為stl提供的標準容器之一,是經常要使用的,有很重要的地位,並且使用起來也是灰常方便。vector又被稱為向量,vector可以形象的描述為長度可以動態改變的陣列,功能和陣列較為相似。實際上更專業的描述為:vector是乙個多功能的,能夠操作多種資料結構和演算法的模板類和函式庫,vector之所以被認為是乙個容器,是因為它能夠像容器一樣存放各種型別的物件,簡單地說,vector是乙個能夠存放任意型別的動態陣列,能夠增加和壓縮資料。(注:stl的容器從實現的角度講可以說是類模板(class teplate)。)

那麼vector和陣列的主要區別是什麼呢??這對於理解vector是很有幫助的~~~~

陣列:分配的是靜態空間,一般分配了就不可以改變,就像我們熟知的定義了乙個陣列,那麼陣列的長度就不可以改變了,我們也不可以進行越界訪問,但是編譯器不檢查越界,這一點在我們程式設計的時候要尤為注意(很多都可能會煩這樣的錯誤!!)。一般申請的陣列長度不能滿足我們的要求了,我們要重新申請大一點陣列,然後把原陣列中資料複製過來。

vector:分配的是動態空間,即:我們發現在宣告vector容器的時候也可以不指定容器的大小,vector是隨著元素的加入,空間自動擴充套件的。但是,我們必須要負責任的肯定vector分配的空間是連續的,也就是支援陣列中的下標隨機訪問,實際上vector的實現機制是:預留一部分空間,而且預留空間的大小是按一定比率增長的,如果空間不夠用的話,要保證連續,就必須重新new一片空間,然後將原有元素移動到新空間,同時預留新的空間(並且新分配的空間比原來分配的空間),最後將原來的那部分空間釋放掉。這樣預留空間的好處就是不用每次向vector中加元素都重新分配空間。

vector容器的宣告方式主要包括一下幾種:

vectorv   ,建立乙個空的vector。

vector v1(v)   ,複製乙個vector。

vector v(n)  ,建立乙個vector,含有n個資料,資料均已預設構造產生。

vector v(n, elem)   ,建立乙個含有n個elem拷貝的vector。

vector v(beg,end)   ,建立乙個以[beg;end)區間的vector。

v.~ vector ()  ,銷毀所有資料,釋放記憶體。

下面用一段**來演示幾種常用的宣告vector的的方式:

#include #include using namespace std;

int main()

;

//程式段1,練習assign(n,t)

v1.assign(3,2);

cout<

for(iter = v1.begin() ; iter != v1.end() ; ++iter)

cout<執行結果:

小結:關於assign函式,對vector變數進行賦值,並且能夠自動完成vector大小的修改。

v.insert(pos,elem)在pos位置插入乙個elem拷貝,傳回新資料位置(位置指傳回位址值)。

v.insert(pos,n,elem)在pos位置插入在[beg,end)區間的資料。無返回值

v.insert(pos,beg,end)在pos位置插入n個elem資料。無返回值

v.erase(pos)刪除pos位置的資料,傳回下乙個資料的位置

v.erase(beg,end)刪除[beg,end)區間的資料,傳回下乙個資料的位置。

小結:注意插入和刪除操作的pos引數用迭代器傳入的。還要注意幾種insert函式的返回值。 

v.capacity()返回容器中資料個數。

v.size()返回容器中實際資料的個數。

v.reserve()保留適當的容量。 

v.resize(num)重新指定佇列的長度。

v.max_size()返回容器中最大資料的數量。

小結:vector 的reserve增加了vector的capacity,但是它的size沒有改變!而resize改變了vector的capacity同時也增加了它的size!這是因為:(1)reserve是為容器預留空間,但在空間內不真正建立元素物件,所以在沒有新增新的物件之前,不能引用容器內的元素。加入新的元素時,要呼叫push_back()/insert()函式。(2)resize則是改變容器的大小,且在建立物件,因此,呼叫這個函式之後,就可以引用容器內的物件了,因此當加入新的元素時,用operator操作符,或者用迭代器來引用元素物件。此時再呼叫push_back()函式,是加在這個新的空間後面的。

c.rbegin()傳回乙個逆向佇列的第乙個資料。

c.rend()傳回乙個逆向佇列的最後乙個資料的下乙個位置。

c.pop_back()刪除最後乙個資料。

c.push_back(elem)在尾部加入乙個資料。

c.front()傳回地乙個資料。

c.back()傳回最後乙個資料,不檢查這個資料是否存在。

c1.swap(c2)將c1和c2元素互換。

swap(c1,c2)同上操作。

STL 序列式容器 vector詳解

vector 的資料安排以及操作方式,與 array 非常相似。兩者唯一的差別在於對空間運用的靈活性。array 是靜態空間,一旦配置了就不能改變。vector 是動態空間,隨著元素的加入,它的內部機制會自行擴充空間以容納新元素。一下內容主要針對 vector 基本的資料結構以及常用的方法進行介紹。...

c 中的STL的vector容器

c 中我相信大家經常要用到stl裡面的各種容器來存放自己的資料,既然我們用的這麼頻繁那麼就相應該有一些疑問?1.容器裡面什麼時候應該存指標?2.容器裡面什麼時候應該存物件?3.容器怎麼在遍歷的時候刪除某元素?4.容器應該怎麼釋放掉?一.分析一下stl裡面工作方式 對於內建型別 int float c...

STL中vector使用詳解

vector類常用的函式如下所示 1.建構函式 vector 建立乙個空vector vector int nsize 建立乙個vector,元素個數為nsize vector int nsize,const t t 建立乙個vector,元素個數為nsize,且值均為t vector const ...