std::array<> 是在 c++11 中引入的,它是舊 C 風格數組的包裝器,具有額外的優勢。
它是一種具有恆定大小元素的順序容器。
std::array 內部定義為類模板,即
template < class T, size_t N > class array;
這里第一個模板參數 T 是要存儲在數組中的元素類型,第二個模板參數即
size_t N 是一個常數,表示數組中元素的數量。
std::array 所需的頭文件即
#include <array>
定義和初始化 std::array<> 對象
std::array<int, 10> arr;
此處,std::array 對象 arr 表示一個固定大小為 10 且未初始化的 int 數組,因此所有 10 個元素都包含垃圾值。
std::array < std::string, 200 > arr1;
這里,std::array 對象 arr1 表示一個固定大小為 200 的字符串數組。
// 前 2 個值將被初始化,其他值為 0。 std::array < int , 10 > arr3 = { 34, 45 } ;
如果我們在初始化期間提供較少數量的元素,則剩余的將使用默認值進行初始化。就像 int 為 0 的情況一樣。所以, arr3 包含,
std::array 還提供了一個成員函數 fill() 來一次性為所有元素設置相同的值。當我們有大數組時很容易。
std::array<int, 10> arr4; // Fill all elements in array with same value arr4.fill(4);
所以,arr4 包含
4,4,4,4,4,4,4,4,4,4
#include <iostream> #include <array> void printArray(std::array<int, 10>& arr) { // Printing array for (auto& elem : arr) std::cout << elem << " , "; std::cout << std::endl; } int main() { // Uninitialized array object contains elements with // garbage values std::array<int, 10> arr1; printArray(arr1); // Initialized array object std::array<int, 10> arr2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; printArray(arr2); // First 2 values will be initialized and others will be 0. std::array<int, 10> arr3 = { 34, 45 }; printArray(arr3); std::array<int, 10> arr4; // Fill all elements in array with same value arr4.fill(4); printArray(arr4); return 0; }
如何獲取 std::array 的大小
std::array 對象的大小始終是常量,即它的第二個模板參數。但是,std::array 提供了一個成員函數 size() 來返回大小即
// Returns the constant size arr.size();
如何訪問 std::array 中的元素
有 3 種方法可以訪問 std::array 中的元素
// 創建並初始化一個大小為 10 的數組。 std::array < int , 10 > arr = { 1,2,3,4,5,6,7,8,9,10 } ;
運算符 []:使用運算符 [] 訪問 std::array 中的元素
int x = arr [ 2 ] ;
使用 [] 運算符訪問超出范圍的元素將導致未定義的行為。
at() : 使用 at() 成員函數訪問 std::array 中的元素
// Accessing element using at() function int x = arr.at(2);
使用 at() 函數訪問任何超出范圍的元素將拋出out_of_range異常。
std::tuple 的 get<>()
int x = std::get < 2 >( arr ) ;
使用 get<> 運算符訪問超出范圍的元素將導致編譯時錯誤。
完整的例子如下,
#include <iostream> #include <array> int main() { // Creating and initializing an array of size 10. std::array<int, 10> arr = { 1,2,3,4,5,6,7,8,9,10 }; // Random access operator [] to fetch any element from array int x = arr[2]; std::cout << "x = " << x << std::endl; // Accessing out of range elements using [] leads to undefined behaviour // i.e. it can give garbage value or crash x = arr[12]; std::cout << "x = " << x << std::endl; // Accessing element using at() function x = arr.at(2); std::cout << "x = " << x << std::endl; // Accessing out of range elements using at() will throw exception try { x = arr.at(12); } catch (const std::out_of_range& exp) { std::cerr << exp.what() << std::endl; } // Accessing elements from std::array object using std::get<>() x = std::get<2>(arr); // Accessing out of range elements using std::get<>() will throw error at compile time //x = std::get<12>(arr); std::cout << "x = " << x << std::endl; return 0; }
Output:
x = 3 x = -927490112 x = 3 array::at: __n (which is 12) >= _Nm (which is 10) x = 3