標準庫vector型別

2021-04-13 05:18:45 字數 2978 閱讀 9852

vector是同一種型別的物件的集合,每個物件都有乙個對應的整數索引值.

和string物件一樣,標準庫將負責管理與儲存元素相關的記憶體.我們把vector稱為容器,是因為它可以包含其他物件.乙個容器中的所有物件都必須是同一種型別.

使用vector之前,必須包含相應的標頭檔案.

#include

using std::vector;

vector是乙個類模板(class template).使用模板可以編寫乙個類定義或函式定義,而用於多個不同的資料型別.因此,我們可以定義儲存string物件的vector,或儲存int值的vector,又或是儲存自定義的類型別物件(如sales_item物件)的vector.

幸運的是,使用類模板時只需要簡單了解類模板是如何定義的就可以了.

宣告從類模板產生的某種型別的物件,需要提供附加資訊,資訊的種類取決於模板.以vector為例,必須說明vector儲存何種物件的型別,通過將型別放在類模板名稱後面的尖括號中來指定型別:

vectorivec;   //ivec holds objects of type int

vectorsales_vec;  //holds sales_items

和其他變數定義一樣,定義vector物件要指定型別和乙個變數的列表.上面的第乙個定義,型別是vector,該型別即是含有若干int型別物件的vector,變數名為ivec.第二個定義的變數名是sales_vec,它所儲存的元素是sales_item型別的物件.

註解:vector不是一種資料型別,而只是乙個類模板,可用來定義任意多種資料型別.vector型別的每一種都制定了其儲存元素的型別.因此,vector和vector都是資料型別.

3.3.1vector物件的定義和初始化

vector類定義了好幾種建構函式,用來定義和初始化vector物件.下面列出了這些建構函式.

vectorv1;  vector儲存型別為t的物件.預設建構函式v1為空.

vectorv2(v1);   v2是v1的乙個副本.

vectorv3(n,i);  v3包含n個值為i的元素.

vectorv4(n);    v4含有值初始化的元素的n個副本.

1.建立確定個數的元素

若要建立非空的vector物件,必須給出初始化元素的值.當把乙個vector物件複製到另乙個vector物件時,新複製的vector中每乙個元素都初始化為原vector中相應元素的副本.但這兩個vector物件必須儲存同一種元素型別:

vectorivec1;   //ivec1 holds objects of type int

vectorivec2(ivec1);  //ok:copy elements of ivec1 into ivec2

vectorsvec(ivec1); //error:svec holds strings,not ints

可以看出,參與複製的兩個物件必須儲存同一種元素型別,而且我們可以留意一下變數的命名.int的,i+vec(vector).string的,s+vec(vector)

可以利用元素個數和元素值對vector物件進行初始化.建構函式用元素個數來決定vector物件儲存元素的個數,元素值制定每個元素的初始值:

vectorivec4(10,=1);  //10 elements,each initialized to -1

vectorsvec(10,"hi!"); //10 strings,each initialized to "hi!"

關鍵概念:vector物件動態增長

vector物件(以及其他標準庫容器物件)的重要屬性就在於可以在執行時高效地新增元素.因為vector增長的效率高,在元素值已知的情況下,最好是動態地新增元素.

小心:雖然可以對給定元素個數的vector物件預先分配記憶體,但更有效的方法是先初始化乙個空vector物件,然後再動態地增加元素(我們隨後將學習如何進行這樣的操作).

2.值初始化

如果沒有制定元素的初始化式,那麼標準庫將自行提供乙個元素初始值進行值初始化(value initialization).這個由庫生成的初始值將用來初始化容器中的每個元素,具體值為何(具體值是什麼),取決於儲存在vector中元素的資料型別.

如果vector儲存內建型別(如int型別)的元素,那麼標準庫將用0值建立元素初始化式:

vectorfvec(10);  //10 elements each initialized to o

如果vector儲存的是含有建構函式的類型別(如string)的元素,標準庫將用該型別的預設建構函式建立元素初始化式:

vectorsvec(10); //10 elements,each an empty string

註解:不久會介紹一些有自定義建構函式但沒有預設建構函式的類,在初始化這種型別的vector物件時,程式設計師就不能僅提供元素個數,還需要提供元素初始值.

還有第三種可能性:元素型別可能是沒有定義任何建構函式的類型別.這種情況下,標準庫仍產生乙個帶初始值的物件,這個物件的每個成員進行了值初始化.

習題3.11下面哪些vector定義不正確?

a.vector>ivec;

b.vectorsvec=ivec;

c.vector令人詫異,不正確的並不是a.而是b.

a中的ivec是儲存vector物件的vector物件(即ivec是vector的vector),而b中svec是定義為儲存string物件的vector物件.二者資料型別不一樣,不能用ivec來初始化svec.

習題3.12 下列每個vector物件中元素個數是多少?各元素的值是什麼?

a.vectorivec1;

b.vectorivec2(10);

c.vectorivec3(10,42);

d.vectorsvec1;

e.vectorsvec2(10);

f.vectorsvec3(10,"hello");

a.0個

b.10個,數值均為0

c.10個,數值均為42.

d.0個

e.10個,值均為空字串.

f.10個,值均為"hello".

標準庫型別vector

宣告 include using std vector 定義和初始化vector物件 vectorv1 vectorv2 v1 vectorv2 v1 vectorv3 n,val v3包含了n個重複的元素,每個元素的值都是val vectorv4 n v4包含了n個重複地執行了值初始化的物件 ve...

標準庫型別vector

文件 vector標準庫 include using std vector 預設初始化 vector a 定義乙個指定型別的空vector 列表初始化 vector b c 11新標準提供的另外一種初始化的方法,建立指定數量的元素 vector n,a 建立了n個型別為t的元素a 值初始化 vect...

標準庫型別vector

標準庫型別vector表示物件的集合,其中所有物件的型別都相同,集合中每個物件都有乙個索引,通過索引可以找到並訪問物件,也可以理解為vector為容器,vector是乙個類模板。即在模板名字後面跟著一對尖括號,在括號內放上資訊,提供的額外資訊就是vector內所存放物件的型別,如 vectorive...