數組的替代品vector和array

數組的替代品vector和array

 

1. 模板類vector

  模板類vector類似於string類,也是一種動態數組。基本上,它是使用new創建動態數組的替代品。實際上,vector類確實是使用newdelete來管理內存,但這工作是自動完成的。示例:

#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>對象。
  一般而言,下面的聲明創建一個名爲vtvector對象,它可以儲存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};

  推而廣之,下面的聲明創建一個名爲arrarray對象,它可以儲存n_elem個類型爲typeName的元素:

array<typeName, n_elem> arr;

  與創建vector對象不同的是,n_elem不能是變量。
  在C++11中,可將列表初始化用於vectorarray對象,但在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對象;而對於數組,必須逐個元素複製數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章