【C++學習筆記】vector和array

好好學習專用部落格發表於2017-04-04

一、模板類vector

vector使用new和delete來自動管理記憶體。

1、首先,使用vector要包含標頭檔案vector;

2、其次,vector包含在名稱空間std中,因此可使用using編譯指令、using宣告或std::vector;

3、第三,模板使用不同語法來指出它所儲存的資料型別;

4、第四,vector類使用不同的語法來指定元素數。

5、使用方法:

vector<double> vt(n_elem);其中n_elem可以是整型常量,也可以是整型變數。

由於vector物件在插入或新增值時自動調整長度,因此可以將初始長度設為零。

二、模板類array(C++11)

vector類的功能比陣列強大,但效率稍低。如果需要長度固定的陣列,使用陣列更佳,但代價是不方便和不安全。C++11新增模板類array,位於名稱空間std中,與陣列一樣,array物件的長度也是固定的,也是用棧(靜態記憶體分配),而不是自由儲存區,因此效率與陣列相同,但更方便與安全。

array<typename,n_elem> arr;

與vector不同,n_elem不能是變數。

在C++11中,可將列表初始化用於vector和array,但在C++98中不能。

三、例子

#include <iostream>
#include <vector>
#include <array>
int main()
{
	using namespace std;

	double a1[4] = {1.2, 2.4, 3.6, 4.8};

	vector<double> 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<double, 4> a3 = {3.14, 2.72, 1.62, 1.41};
	array<double, 4> 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;

	cin.get();
	return 0;
}

索引-2即*(a1-2) = 20.2;

其含義如下:

找到a1指向的地方,向前移兩個double元素,並將20.2儲存到目的地。即是將資訊儲存到陣列外面。與C語言一樣,C++也不檢查這種超界錯誤,在這個示例中,這個位置位於array物件a3中。其他編譯器可能將20.2放在a4中,這表明陣列的行為是不安全的。

使用成員函式at()或中括號表示法避免不安全的行為

a2.at(1) = 2.3;

兩者的區別在於,使用at()時,將在執行期間捕獲非法索引,而程式預設將中斷。這種額外檢查代價是執行時間更長。

下面這些類能夠降低意外超界錯誤的概率,如begin()和end()。

相關文章