米雪兒 [C++] 程式設計教學:std::array 陣列物件

C++陣列
Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

本文承接前文的主題,繼續介紹 C++ 的陣列。本文的主題是 std::array 物件。這類物件提供的方法具有邊界檢查,和 C 陣列相異。

建立陣列

使用以下語法建立 std::array 物件。初始化時要指定資料型態和元素個數:

std::array<int, 5> arr = {3, 4, 5, 6, 7};

這裡用到一些泛型程式的語法。目前還不需自己寫泛型程式,只要會用現存的泛型程式即可。

也可以用新式的初始化語法來建立 std::array 物件:

std::array<int, 5> arr { {3, 4, 5, 6, 7} };

存取陣列的元素

std::array 物件同樣使用非負整數做為索引 (index) 來存取陣列元素。使用 std::arrayat 方法 (method) 存取元素的方式如下:

#include <array>
#include <cassert>

int main(void)
{
    std::array<int, 5> arr = {3, 4, 5, 6, 7};

    assert(arr.at(0) == 3);
    assert(arr.at(2) == 5);
    assert(arr.at(4) == 7);

    arr.at(2) = 99;

    assert(arr.at(0) == 3);
    assert(arr.at(2) == 99);
    assert(arr.at(4) == 7);

    return 0;
}

使用 at 方法存取陣列元素時,會自動進行邊界檢查。出現異常存取時會拋出例外 (exception)。

如果不需要邊界檢查,可以用原本的陣列運算子來存取 std::array 物件:

#include <array>
#include <cassert>

int main(void)
{
    std::array<int, 5> arr = {3, 4, 5, 6, 7};

    assert(arr[0] == 3);
    assert(arr[2] == 5);
    assert(arr[4] == 7);

    arr[2] = 99;

    assert(arr[0] == 3);
    assert(arr[2] == 99);
    assert(arr[4] == 7);

    return 0;
}

其實 std::array 物件的陣列運算子覆寫了 (overloading) 內建的陣列運算子,而且在行為上刻意和內建陣列運算子保持一致。

走訪陣列

std::array 陣列物件具有三種走訪方式。傳統的計數器仍然是可用的:

#include <array>
#include <cstddef>
#include <iostream>

int main(void)
{
    std::array<int, 5> arr = {3, 4, 5, 6, 7};

    for (size_t i = 0; i < arr.size(); i++) {
        std::cout << arr[i] << std::endl;
    }

    return 0;
}

由於 std::array 內部有存陣列的大小,可以直接透過其 size 方法來取得。

當然也可以使用隱式的迭代器來走訪陣列:

#include <array>
#include <iostream>

int main(void)
{
    std::array<int, 5> arr = {3, 4, 5, 6, 7};

    for (auto i : arr) {
        std::cout << i << std::endl;
    }

    return 0;
}

這時候不能修改陣列元素。如果要在走訪時修改陣列元素,要改用顯式的迭代器來走訪陣列:

#include <array>
#include <iostream>

int main(void)
{
    std::array<int, 5> arr = {3, 4, 5, 6, 7};

    for (auto iter = arr.begin(); iter != arr.end(); ++iter) {
        std::cout << *iter << std::endl;
    }

    return 0;
}