C 學習筆記十三 陣列的替代品

2021-07-25 02:15:43 字數 3221 閱讀 9682

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

模板類vector類似於string類,也是一種動態陣列。

可以在執行階段設定vector物件的長度,可在末尾附加新資料,還可在中間插入新資料。

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的double陣列

其中,vi是乙個vector< int> 物件,vd是乙個vector< double>物件。

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

一般而言,下面的宣告建立乙個名為vt的vector物件,它可儲存n_elem個型別為typename的元素:

vector

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

vector類的功能比陣列強大,但效率較低。如果需要的是固定長度的陣列,直接使用陣列是更好的選擇,但陣列不那麼方便和安全。

c++11新增了模板類array,它也位於命名空間std中。

與陣列一樣,array物件的長度也是固定的,也是用棧(靜態記憶體分配),而不是自由儲存區,因此其效率與陣列相同,但更方便安全。

要建立array類,需要包含標頭檔案array。

array物件的建立語法與vector稍有不同:

#include

...using

namespace

std;

array

ai; //建立乙個包含5個int的array物件

array

ad = ;

一般地,下面的宣告建立乙個名為arr的array物件,它包含n_elem個型別為typename的元素:

array

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

在c++11中,還可將列表初始化用於vector和array物件。

程式4.24

#include

#include

#include

int main()

; //c++98 stl:

vector

a2(4); //建立乙個含有4個元素的vector物件

//在c98中沒有簡單的初始化方法:

a2[0] = 1.0 / 3.0;

a2[1] = 1.0 / 5.0;

a2[2] = 1.0 / 7.0;

a2[3] = 1.0 / 9.0;

//c++11--建立和初始化array物件:

array

a3 = ;

array

a4;

a4 = a3; //對相同長度的array物件進行賦值是有效的

//使用陣列記法:

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[-6] = 20.2;

cout

<< "a1[-6]: "

<< a1[-6] << " at "

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

cout

<< "a3[2]: "

<< a3[2] << " at "

<< &a3[2] << endl;

cout

<< "a4[2]: "

<< a4[2] << " at "

<< &a4[2] << endl;

cin.get();

return

0;}

程式說明

無論是陣列、vector物件還是array物件,都可使用標準陣列表示法來訪問各個元素。

從位址可知,array物件和陣列儲存在相同的記憶體區域(即棧)中,而vector物件儲存在另乙個區域(自由儲存區或堆)中。

可以將乙個array物件賦給另乙個array物件;而對於陣列,必須逐元素複製資料。

a1[-6] =20.2;
這行**將被轉換為*(a1-2) = 20.2;

其含義為:找到a1指向的地方,向前移6個double元素,並將20.2儲存到目的地。也就是說,將資訊儲存到陣列的外面。

與c語言一樣,c++也不檢查這種越界錯誤。在這個示例中,這個位置位於array物件a3中。這表明陣列的行為是不安全的。

對於vector物件和array物件,仍可以編寫這種不安全的**:

a2[-2] = .5;

a3[200] = 1.4; //仍然允許

然而,還有其他選擇。可以使用成員函式at():

a2.at(1) = 2.3;    //將2.3賦給a2[1]
使用at()時,將在執行期間捕獲非法索引,而程式預設將中斷。這種額外檢查的代價是執行時間更長。

陣列的替代品

模板類vector和array是陣列的替代品。vector是一種動態陣列,使用堆分配記憶體,可以增 刪 改 查,缺點是效率低。include.using namespace std std vectortemp int n cin n std vectortemp1 n 建立n個原始的陣列vecto...

陣列的替代品

1 include 標準輸出流 2 include 迭代器物件 3 include 排序演算法標頭檔案 4 using namespace std 5void aa 8 向陣列末尾新增一條資料 9 vecdouble.push back 100.8 10 vector iterator it 得到迭...

陣列的替代品

1.模板類vector vectorarray1 n elem 宣告建立乙個名為array1的vector物件,它可儲存n elem個型別為typename的元素 n elem可以是整形常量 變數 1 vector array1 4 2 array 0 0.0 3 array 1 1.0 4 arr...