模板類vector和array是陣列的替代品。1. 模板類vector
模板類vetor類似於string類,也是一種動態陣列。可以在執行階段設定vector物件的長度,可在末尾附加新資料,還可在中間插入新資料。基本上,它是使用new建立動態陣列的替代品。實際上,vector類確實使用new和delete來管理記憶體,但這種工作是自動完成的。
首先,要使用vector物件,必須包含標頭檔案vector。其次,vector包含在命名空間std中,因此您可使用using編譯指令,using宣告或者std::vector。第三,模板使用不同的語法來指出它儲存的資料型別。第四,vector類使用不同的語法來制定元素數。下面示例:
由於vector物件在插入或新增值時自動調整長度,因此可以將vi的初始長度設定為零。如果要調整長度,需要使用vector包中的各種方法。#include
...using
namespace
std;
vector
vi; // 建立乙個長度為0的int陣列
int n;
cin >> n;
vector
vd(n);//建立乙個長度為n doubles的陣列
一般的,下面的生命建立乙個名為vt的vector物件,可以儲存n_elem個型別為typename的元素:
2. 模板類array(c++11)vector
vt(n_elem); // 引數n_elem可以使整型常量,也可以是整型變數
vector類的功能比陣列強大,但付出的代價是效率稍低。如果需要的是長度固定的陣列,使用陣列是更佳的選擇,但代價是不那麼方便和安全。因此,c++11增加了模板類array,它也位於命名空間std中。與陣列一樣,array物件的長度也是固定的,也使用棧(靜態記憶體分配),而不是自由儲存區,因此其效率與陣列相同,但更方便,更安全。要建立array物件,需要包含標頭檔案array。array物件的建立語法與vector稍有不同:
推而廣之,下面的宣告建立乙個名為arr的array物件,它包含n_elem個型別為typename的元素:#include
...using
namespace
std;
array
ai; //建立乙個5個int的陣列
array
ad = ;
在c++11中,可將列表初始化用於vector和array物件,但在c++98中,不能對vector物件這樣做。array
arr; //與vector物件不同,n_elem不能是變數
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;}
首先,無論是陣列、vector物件還是array物件,都可使用標準陣列表示法來訪問各個元素。其次,從位址可知,array物件和陣列儲存在相同的記憶體區域(即棧)中,而vector物件儲存在另乙個區域(自由儲存區或堆)中。第三,注意到可以將乙個array物件賦值給另乙個array物件;而對於陣列,必須逐個元素複製資料。下面是該程式的輸出結果:
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
對於這一行**
a1[-2] =20.2;
索引-2的含義是:找到a1指向的地方,向前移動兩個double元素,並將20.2儲存得到目的地。也就是說,將資訊儲存到陣列的外面。與c語言一樣,c++不檢查這種超界錯誤。在這個示例中,這個位置位於array物件a3中。其他編譯器可能將20.2放在a4中,或者其他的可能性。這表明陣列的行為是不安全的。
vector與array物件仍允許這種不安全的**。
但可以使用其他選擇。一種選擇是使用成員函式at().就想可以使用cin物件的成員函式getline()一樣。
中括號表示法和成員函式at()的差別在於,使用at()時,將在執行期間捕獲非法索引,而程式預設將中斷。這種額外檢查的代價就是執行時間更長。另外,這些類包含成員函式begin()和end(),能夠確定邊界,一面無意間超界。a2.at(1) = 2.3
//將2.3賦值給a2[1]
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 ...