文章目錄
- 一、概述
- 二、std::array的特點
- 三、std::array的定義與初始化
- 三、std::array的常用成員函數
- 四、與 C 風格數組的互操作
一、概述
在 C++11 中,std::array 是一個新的容器類型,它提供了一個固定大小的數組封裝。相比傳統的 C 風格數組,std::array 提供了更多的功能和類型安全性,并且更符合現代 C++ 的風格。std::array 是一個模板類,定義在 頭文件中,它封裝了固定大小的數組,并提供了更方便的訪問和操作方法。
二、std::array的特點
- 固定大小:std::array 的大小在編譯時確定,不能在運行時動態改變。
- 類型安全:由于 std::array 是模板類,它保證了元素的類型安全,且可以使用類型推斷。
- 支持標準容器接口:std::array 提供了與其他標準容器類似的接口,如 begin(), end(), size(), empty(), at(), [] 等。
- 可以與 C 風格數組互操作:std::array 可以通過 data() 方法訪問底層的 C 風格數組。
三、std::array的定義與初始化
std::array 是一個模板類,其模板參數為元素類型和容器大小。
1. 定義與初始化
#include <iostream>
#include <array>int main() {// 定義一個包含 5 個整數的 std::arraystd::array<int, 5> arr = {1, 2, 3, 4, 5};// 訪問元素std::cout << "arr[0] = " << arr[0] << std::endl;// 使用范圍 for 循環打印元素for (const auto& elem : arr) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}
2. 使用 fill() 方法初始化
可以使用 fill() 方法為所有元素賦值相同的值:
std::array<int, 5> arr;
arr.fill(10); // 所有元素被初始化為 10
3. 通過列表初始化
std::array 還可以通過列表初始化進行初始化:
std::array<int, 3> arr = {1, 2, 3}; // 列表初始化
三、std::array的常用成員函數
std::array 提供了很多類似于其他 STL 容器的成員函數,包括獲取容器大小、訪問元素、檢查是否為空等。
1. size():返回數組的大小
std::array 的 size() 函數用于返回數組中元素的數量。與 std::vector 不同,std::array 的大小是固定的(在編譯時已知),所以 size() 返回的是數組的元素總數,而不是動態變化的長度。
#include <iostream>
#include <array>int main() {// 創建一個 std::array,包含 5 個整數元素std::array<int, 5> arr = {1, 2, 3, 4, 5};// 獲取并輸出數組的大小std::cout << "數組的大小: " << arr.size() << std::endl; // 輸出: 5// 使用 size() 來遍歷數組for (std::size_t i = 0; i < arr.size(); ++i) {std::cout << "arr[" << i << "] = " << arr[i] << std::endl;}return 0;
}
運行結果:
解釋:
- 在上面的代碼中,arr.size() 返回了 5,表示 std::array<int, 5> 中有 5 個元素。
- size() 是一個常量時間操作,它的返回值是編譯時已知的常量,因此非常高效。
注意事項:
- size() 不會返回數組中有效元素的數量。它返回的是數組的固定大小,即使部分元素沒有被賦值,大小依然是固定的;對于 std::array,size() 是編譯時確定的固定值。
- 對于 std::array<T, N>,size() 始終返回 N,而不會隨著元素的初始化狀態變化;size() 提供了數組的固定大小,返回容器中的元素個數。
通過 size() 使用 std::array:
在許多情況下,你可以使用 size() 來使代碼更加靈活。舉個例子,如果你需要遍歷一個 std::array,使用 size() 可以避免硬編碼數組的長度:
#include <iostream>
#include <array>int main() {std::array<int, 5> arr = {10, 20, 30, 40, 50};// 使用 size() 來遍歷整個數組for (auto& value : arr) {std::cout << value << " ";}std::cout << std::endl;return 0;
}
2. at():返回指定索引的元素,并進行越界檢查
std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::cout << "Element at index 2: " << arr.at(2) << std::endl; // 輸出 3// 如果索引越界,將拋出 std::out_of_range 異常
try {std::cout << arr.at(10) << std::endl; // 異常
} catch (const std::out_of_range& e) {std::cout << e.what() << std::endl; // 輸出異常信息
}
3. operator[]:通過索引訪問元素(沒有越界檢查)
std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::cout << "Element at index 3: " << arr[3] << std::endl; // 輸出 4
4.begin() 和 end():返回指向數組開始和結束的迭代器
std::array<int, 5> arr = {1, 2, 3, 4, 5};for (auto it = arr.begin(); it != arr.end(); ++it) {std::cout << *it << " "; // 輸出 1 2 3 4 5
}
5. front() 和 back():返回數組的第一個和最后一個元素
std::array<int, 5> arr = {1, 2, 3, 4, 5};
std::cout << "First element: " << arr.front() << std::endl; // 輸出 1
std::cout << "Last element: " << arr.back() << std::endl; // 輸出 5
6. fill():填充整個數組
std::array<int, 5> arr;
arr.fill(42); // 所有元素都被設置為 42
7. swap():交換兩個 std::array
std::array<int, 3> arr1 = {1, 2, 3};
std::array<int, 3> arr2 = {4, 5, 6};
arr1.swap(arr2); // 交換 arr1 和 arr2 的內容for (int i : arr1) {std::cout << i << " "; // 輸出 4 5 6
}
8.empty():表示 std::array 是否為空
empty() 函數返回一個布爾值,表示 std::array 是否為空。如果數組的大小為 0,返回 true,否則返回 false。注意,std::array 在聲明時是一個固定大小的數組,因此它的大小在編譯時就已經確定。即使數組的元素沒有被賦值,empty() 仍然根據數組的大小來判斷是否為空。
#include <iostream>
#include <array>int main() {// 創建一個固定大小的 std::arraystd::array<int, 5> arr = {1, 2, 3, 4, 5};// 使用 empty() 檢查數組是否為空if (arr.empty()) {std::cout << "數組是空的!" << std::endl;} else {std::cout << "數組不為空!" << std::endl;}// 創建一個空數組std::array<int, 0> empty_arr;// 使用 empty() 檢查空數組if (empty_arr.empty()) {std::cout << "空數組是空的!" << std::endl;} else {std::cout << "空數組不為空!" << std::endl;}return 0;
}
運行結果:
說明:
- 對于 std::array<int, 5>,它的大小是固定的為 5,因此 empty() 會返回 false,即使數組中沒有實際賦值的元素。
- 對于 std::array<int, 0>,大小為 0,empty() 會返回 true。
總結:
- empty() 判斷的是數組的大小是否為零,而不是數組中的元素是否已被初始化或賦值。
- std::array 的大小在編譯時確定,所以它的 empty() 判斷只會在大小為零時返回 true。
四、與 C 風格數組的互操作
std::array 提供了 data() 方法,可以返回底層的 C 風格數組指針,這使得它能夠與傳統的 C 風格數組兼容:
std::array<int, 5> arr = {1, 2, 3, 4, 5};
int* p = arr.data(); // 獲取指向數組的指針// 修改數組元素
p[2] = 100;
for (int val : arr) {std::cout << val << " "; // 輸出 1 2 100 4 5
}