C 模板類vector和array

2021-08-09 22:52:05 字數 3298 閱讀 5114

模板類vector和array是陣列的替代品。

1. 模板類vector

模板類vetor類似於string類,也是一種動態陣列。可以在執行階段設定vector物件的長度,可在末尾附加新資料,還可在中間插入新資料。基本上,它是使用new建立動態陣列的替代品。實際上,vector類確實使用new和delete來管理記憶體,但這種工作是自動完成的。

首先,要使用vector物件,必須包含標頭檔案vector。其次,vector包含在命名空間std中,因此您可使用using編譯指令,using宣告或者std::vector。第三,模板使用不同的語法來指出它儲存的資料型別。第四,vector類使用不同的語法來制定元素數。下面示例:

#include

...using

namespace

std;

vector

vi; // 建立乙個長度為0的int陣列

int n;

cin >> n;

vector

vd(n);//建立乙個長度為n doubles的陣列

由於vector物件在插入或新增值時自動調整長度,因此可以將vi的初始長度設定為零。如果要調整長度,需要使用vector包中的各種方法。

一般的,下面的生命建立乙個名為vt的vector物件,可以儲存n_elem個型別為typename的元素:

vector

vt(n_elem); // 引數n_elem可以使整型常量,也可以是整型變數

2. 模板類array(c++11)

vector類的功能比陣列強大,但付出的代價是效率稍低。如果需要的是長度固定的陣列,使用陣列是更佳的選擇,但代價是不那麼方便和安全。因此,c++11增加了模板類array,它也位於命名空間std中。與陣列一樣,array物件的長度也是固定的,也使用棧(靜態記憶體分配),而不是自由儲存區,因此其效率與陣列相同,但更方便,更安全。要建立array物件,需要包含標頭檔案array。array物件的建立語法與vector稍有不同:

#include

...using

namespace

std;

array

ai; //建立乙個5個int的陣列

array

ad = ;

推而廣之,下面的宣告建立乙個名為arr的array物件,它包含n_elem個型別為typename的元素:

array

arr; //與vector物件不同,n_elem不能是變數

在c++11中,可將列表初始化用於vector和array物件,但在c++98中,不能對vector物件這樣做。

3. 比較陣列、vector物件和array物件

要了解三者的區別,看乙個程式示例。

#include

#include

#include

int main()

; vector

a2(4);

a2[0] = 1.0 / 3.0;

a2[1] = 1.0 / 5.0;

a2[2] = 1.0 / 7.0;

a2[3] = 1.0 / 9.0;

array

a3 = ;

array

a4;

a4 = a3;

cout

<< "a1[2]:"

<< a1[2] << " at "

<< &a1[2] << endl;

cout

<< "a2[2]:"

<< a2[2] << " at "

<< &a2[2] << endl;

cout

<< "a3[2]:"

<< a3[2] << " at "

<< &a3[2] << endl;

cout

<< "a4[2]:"

<< a4[2] << " at "

<< &a4[2] << endl;

a1[-2] =20.2;

cout

<< "a1[-2]:"

<< a1[-2] << " at "

<< &a1[-2] << endl;

cout

<< "a3[2]:"

<< a3[2] << " at "

<< &a3[2] << endl;

cout

<< "a4[2]:"

<< a4[2] << " at "

<< &a4[2] << endl;

return

0;}

下面是該程式的輸出結果:

a1[2]: 3.6

at 0x28ccce8

a2[2]: 0.142857

at 0xca0328

a3[2]: 1.62

at 0x28ccc8

a4[2]: 1.62

at 0x28cca8

a1[-2]: 20.2

at 0x28ccc8

a3[2]: 20.2

at 0x28ccc8

a4[2]: 1.62

at 0x28ccc8

首先,無論是陣列、vector物件還是array物件,都可使用標準陣列表示法來訪問各個元素。其次,從位址可知,array物件和陣列儲存在相同的記憶體區域(即棧)中,而vector物件儲存在另乙個區域(自由儲存區或堆)中。第三,注意到可以將乙個array物件賦值給另乙個array物件;而對於陣列,必須逐個元素複製資料。

對於這一行**

a1[-2] =20.2;
索引-2的含義是:找到a1指向的地方,向前移動兩個double元素,並將20.2儲存得到目的地。也就是說,將資訊儲存到陣列的外面。與c語言一樣,c++不檢查這種超界錯誤。在這個示例中,這個位置位於array物件a3中。其他編譯器可能將20.2放在a4中,或者其他的可能性。這表明陣列的行為是不安全的。

vector與array物件仍允許這種不安全的**。

但可以使用其他選擇。一種選擇是使用成員函式at().就想可以使用cin物件的成員函式getline()一樣。

a2.at(1) = 2.3

//將2.3賦值給a2[1]

中括號表示法和成員函式at()的差別在於,使用at()時,將在執行期間捕獲非法索引,而程式預設將中斷。這種額外檢查的代價就是執行時間更長。另外,這些類包含成員函式begin()和end(),能夠確定邊界,一面無意間超界。

C 簡單Vector模板類

用template 來實現n維向量的相關性質。寫的時候其中有幾個關鍵的地方 1.模板類的函式定義必須和標頭檔案放在乙個cpp檔案裡,系統不支援模板類的單獨編譯。2.定義模板類的成員 友元 函式時,都要加 template or template 3.對於模板類的友元函式,都宣告成了非約束 unbou...

C 中 vector容器 模板類陣列

對vector容器的一點理解,相對於陣列,vector容器可以不固定大小,但是需要而外的記憶體 空間,這是用空間來換取陣列動態大小的一種方式 1.定義 vector a 定義了乙個空的int型陣列 vectorb n 定義了乙個長度為n的double型陣列 vectorb c 定義乙個c的副本 ve...

C 模板類和類模板

用相同的類模板可以組建任何型別的物件集合。在傳統c 中,可能有乙個浮點數類或者乙個整數類,如果使用類模板,可以定義乙個對兩者都適用的類number。類模板說明 類模板說明的一般形式是 template 型別形參表 class 類名 template 型別形參表 返回型別 類名 型別名錶 成員函式1 ...