數組的替代品vector和array
1. 模板類vector
模板類vector
類似於string
類,也是一種動態數組。基本上,它是使用new創建動態數組的替代品。實際上,vector
類確實是使用new
和delete
來管理內存,但這工作是自動完成的。示例:
#include <vector>
...
using namespace std;
vector<int> vi; // create a zero-size array of int
int n;
cin >> n;
vector<double> vd(n); // create an array of n doubles
其中,vi
是一個vector<int>
對象,vd
是一個vector<double>
對象。
一般而言,下面的聲明創建一個名爲vt
的vector
對象,它可以儲存n_elem
個類型爲typeName
的元素:
vector<typeName> vt(n_elem);
其中參數n_elem
可以是整型常量,也可以是整型變量。
2. 模板類array
vector
類的功能比數組強大,但付出的代價是效率較低。如果需要長度固定的數組,使用數組是更佳的選擇。有鑑於此,C++11新增了模板類array
,它也位於名稱空間std
中。與數組一樣,array
對象的長度也是固定的,也使用棧(靜態內存分配),而不是自由存儲區,因此其效率與數組相同,但更方便,安全。示例:
#include <array>
...
using namespace std;
array<int, 5> ai; // create array object of 5 ints
array<double, 4> ad = {1.2, 2.1, 3.43, 4.3};
推而廣之,下面的聲明創建一個名爲arr
的array
對象,它可以儲存n_elem
個類型爲typeName
的元素:
array<typeName, n_elem> arr;
與創建vector
對象不同的是,n_elem
不能是變量。
在C++11中,可將列表初始化用於vector
和array
對象,但在C++98中,不能對vector
對象這樣做。
3. 比較數組、vector對象和array對象
// choices.cpp -- array variations
#include <iostream>
#include <vector>
#include <array>
using namespace std;
int main ()
{
// C, original C++
double a1[4] = {1.2, 2.4, 3.6, 4.8};
// C++98 STL
vector<double> a2(4); // create vector with 4 elements
// no simple way to initialize in 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 -- create and initialize array object
array<double, 4> a3 = {3.14, 2.72, 1.63, 1.41};
array<double, 4> a4;
a4 = a3; // valid for array objects of same size
// use array notation
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;
//misdeed
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 0x7ffe05dc07c0
a2[2]: 0.142857 at 0xb87020
a3[2]: 1.63 at 0x7ffe05dc07e0
a4[2]: 1.63 at 0x7ffe05dc0800
a1[-2]: 20.2 at 0x7ffe05dc07a0
a3[2]: 1.63 at 0x7ffe05dc07e0
a4[2]: 1.63 at 0x7ffe05dc0800
程序說明:
首先,注意到無論是數組,vector
對象還是array
對象,都可以使用標準數組表示法來訪問各個元素。其次,從地址可知array
對象和數組存儲在相同的內存區域(即棧)中,而vector
對象存儲在另一個區域(自由存儲區或堆)中。第三,可以將一個array
對象賦給另一個array
對象;而對於數組,必須逐個元素複製數據。