HOWTO · C++

如何在 C++ 中查詢陣列大小

本文演示瞭如何找到一個陣列的長度。

本頁內容

在 C++ 中,要找出陣列的長度,就是計算其中的元素數量。適合的方法取決於型別:對仍在宣告作用域中的內建陣列使用 sizeof,對 std::array 或 std::vector 使用 size(),或使用通用的標準函式 std::size。如果範圍本身可以逐一走訪,也可以用範圍式 for 迴圈計數。

使用範圍式 for 迴圈計算 C++ 陣列的元素數量

範圍式 for 迴圈會逐一走訪陣列或其他可迭代範圍中的元素。每走訪一個元素就將計數器加一,即可計算元素數量:

#include <iostream>

int main() {
    int values[] = {10, 20, 30, 40, 50};
    int count = 0;

    for (int value : values) {
        (void)value;
        ++count;
    }

    std::cout << "Element count: " << count << '\n';
}

這會計算 values 所提供範圍中的元素數量。它無法得知裸指標或動態配置儲存空間的配置大小;遇到這類情況時,請另外保存元素數量,或改用能回報大小的容器。

使用 sizeof 找出內建陣列的長度

只要內建陣列在目前作用域中仍是陣列,就可以用陣列占用的總位元組數除以單一元素占用的位元組數:

#include <iostream>
#include <cstddef>

int main() {
    int values[] = {1, 2, 3, 4, 5};
    const std::size_t count = sizeof(values) / sizeof(values[0]);

    std::cout << "Element count: " << count << '\n';
}

sizeof(values) 會取得整個陣列占用的位元組數,sizeof(values[0]) 則會取得一個元素占用的位元組數。兩者相除即可得到元素數量。範例使用 <cstddef> 來宣告 std::size_t。

將陣列傳入函式後,這種計算就無法再用來取得元素數量。寫成 int values[] 的參數會調整為 int* values;在函式內,sizeof(values) 測量的是指標,而非原始陣列。相除所得的結果取決於實作中的指標和元素大小,因此無法可攜地代表元素數量。請另外傳入元素數量,或改用容器作為參數。

對 std::array 和 std::vector 使用 size()

std::array 和 std::vector 都提供 size() 成員函式,可回傳元素數量。std::array 代表固定大小的陣列;std::vector 的大小則會隨著元素新增或移除而改變。

#include <array>
#include <iostream>
#include <vector>

int main() {
    std::array<int, 3> fixed{4, 8, 12};
    std::vector<int> resizable{5, 10, 15, 20};

    std::cout << "std::array: " << fixed.size() << '\n';
    std::cout << "std::vector: " << resizable.size() << '\n';
}

請使用你所用容器的成員函式。std::array::size() 回報固定的元素數量;std::vector::size() 回報向量目前的元素數量。

使用 std::end() 和 std::begin() 找出陣列長度

對內建陣列而言,std::begin 指向第一個元素,std::end 則指向最後一個元素之後的位置。將這兩個指標相減,即可取得兩者之間的元素數量。使用這些函式時,請包含 <iterator>。

#include <iostream>
#include <iterator>

int main() {
    int values[] = {2, 4, 6, 8};
    const auto count = std::end(values) - std::begin(values);

    std::cout << "Element count: " << count << '\n';
}

只有在兩個指標都指向同一個陣列中的位置,或其中一個指向該陣列尾端之後的位置時,相減才有效。這種方法適用於內建陣列;若使用 std::array 或 std::vector,通常直接呼叫 size() 更清楚。

使用 std::size() 取得元素數量

std::size 是標準函式庫中的函式,會回傳元素數量。它適用於內建陣列,以及 std::array、std::vector 等標準容器。使用時請包含 <iterator>。

#include <array>
#include <iostream>
#include <iterator>
#include <vector>

int main() {
    int built_in[] = {3, 6, 9};
    std::array<int, 2> fixed{7, 14};
    std::vector<int> resizable{11, 22, 33, 44};

    std::cout << "Built-in array: " << std::size(built_in) << '\n';
    std::cout << "std::array: " << std::size(fixed) << '\n';
    std::cout << "std::vector: " << std::size(resizable) << '\n';
}

與 size() 成員函式不同,std::size(container) 是以獨立函式呼叫的形式使用。對支援的陣列和容器,它提供一致的呼叫寫法;各容器本身的 size() 成員函式仍可使用。

依陣列型別選擇合適的方法

  • 對仍在宣告作用域中的內建陣列,可使用 sizeof(array) / sizeof(array[0]) 或 std::size(array)。
  • 對 std::array 和 std::vector,優先使用各自的 size() 成員函式。若想採用一致的函式呼叫方式,也可以使用 std::size(container)。
  • 當迭代器相減適合周邊程式碼時,可使用 std::end(array) - std::begin(array)。
  • 若想逐一走訪可迭代範圍中的元素並計數,可使用範圍式 for 迴圈。
  • 對指標或動態配置的陣列,請另外保存元素數量,或改用容器。指標本身不會記錄配置空間中的元素數量。

關鍵在於區分位元組表示的儲存空間大小和元素數量。sizeof 測量的是位元組;只有在運算式仍指向完整的內建陣列時,才能用單一元素的位元組數去除。容器的大小函式和迭代器相減則會直接回報元素數量。