# C++ STL array 簡單整理用法 ###### tags: `STL` 初學STL array 整理一些用法 使用前先使用`#include <array>` 宣告一個五個元素大小的陣列myArray ``` std::array<int, 5> myArray; ``` 宣告時一定得給予大小 支援兩種初始化 ``` std::array<int, 5> myArray = {1, 2, 3, 4, 5} // intialized list; std::array<int, 5> myArray {1, 2, 3, 4, 5}; // intialized uniform list; ``` STL Container 支援 array 複製 或 intialized list 賦值 ``` std::array<int, 5> myArray2 = myArray; std::array<int, 5> myArray3; myArray3 = myArray; myArray = {8, 7, 6, 5, 4}; ``` 對陣列元素存取有兩種方式 第一種用下標(subscribe) [] 存取 `myArray[1] = 5;` 第二種用at()存取 `myArray.at(1) = 5;` 值得一提的是at() 會做邊界檢查,如果超出邊界會丟出例外,否則回傳元素參考 ## 比較 [] 與 at() 1. [] 存取速度較快,at()較慢但較安全 2. []沒有邊界檢查,at()有 比較Cstyle array跟STL array Cstyle array 有可能被隱轉成pointer,傳遞到函數時無法得知大小 而STL array保有原始大小 得知其大小方法`myArray.size()` ## 宣告二維陣列 `std::array<std::array<int, 3>, 5> arr2;` 等同於Cstyle array宣告如下 `int arr[3][5];` ## 迴圈用法 1. for-each (ranged for) loops ``` for(auto &element : myArray) { std::cout << element; } ``` 2. iterator ``` /*未來補上*/ ``` 3. size_type ``` for(std::myArray<int , 5>::size_type i {0}; i < myArray.size(); ++i) { std::cout << myArray.at(i); } ``` or using ` using index_t = std::array<int, 5>::size_type;` ``` using index_t = std::array<int, 5>::size_type; for(index_t i {0}; i < myArray.size(); ++i) { std::cout << myArray.at(i); } ``` 原因是因為索引跟size()回傳的都是unsigned type 也可以使用 size_t,最佳解是不要手動操作索引且使用for_each ## std::sort() from large to small: ``` std::sort(myArray.begin(), myArray.end(), [](int x, int y){ return x > y;}); ```